Макрос для определения структуры в C или C ++

0

Можно ли определить структуру с переменным размером массива. что-то вроде этого:

#define CHAR_ARRAY(MAX_LENGTH) struct CHAR_ARRAY_#MAX_LENGTH{char data[MAX_LENGTH]; int length;};

так что с помощью только указанного макроса я мог бы определить разные типы данных следующим образом.

struct Data{
CHAR_ARRAY(4) a;
CHAR_ARRAY(8) b;
};

Из-за особых требований существующего кода требуется простой старый тип, определенный с помощью "struct", без использования std :: array, vector и т.д., Указатель не принимается, поскольку наш устаревший код имеет требование быть простым старым типом, поэтому назначение или копирование можно легко обрабатывать.

  • 0
    Разве вы не можете использовать указатель на символ вместе с полем размера?
  • 5
    Ты это пробовал? Кстати, вы, вероятно, ищете ## , а не # .
Показать ещё 8 комментариев
Теги:
c-preprocessor
macros

1 ответ

4
Лучший ответ

Да, это возможно. Вам вообще не нужно указывать структуру, что упрощает макрос:

#define CHAR_ARRAY(MAX_LENGTH) struct {char data[MAX_LENGTH]; int length;}

(Использование, как в вашем примере.)

Тем не менее, Im все еще не совсем ясно о цели этого макроса, так как это существенно реинжинирует, плохо, существующую функциональность. По крайней мере, вы должны использовать шаблон вместо макроса для генерации типа для вас:

template <std::size_t N>
struct char_array { char data[N]; std::size_t length; };

А затем введите тип элемента generic:

template <typename T, std::size_t N>
struct array { T data[N]; std::size_t length; };

... и теперь это становится ослепительно очевидным, что это плохая повторная реализация std::array, и что нет никакой пользы не только в использовании последнего.

  • 0
    Кажется, есть необходимость как в C, так и в C ++.
  • 1
    @Richard Ничто в вопросе / комментариях OP не указывает на это. Действительно, вопрос, кажется, неправильно помечен, во всяком случае. Во всяком случае, макрос, очевидно, также работает в C.
Показать ещё 17 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню