У меня есть грубый сгенерированный заголовок из некоторых файлов .dbc
. Поскольку некоторые из сообщений представляют элементы из массива, структура равна и, следовательно, сгенерированные макросы равны. Поскольку я заполняю некоторый массив структуры в коде, я хотел бы сохранить усилия и использовать один и тот же макрос для всех объектов, но чтобы гарантировать, что определения не изменились, я бы хотел проверить во время компиляции, если макросы равны.Сравните макросы препроцессора для равенства
Пример:
#define GET_PATTERN_01_PATTERNPOINT02Y(buf) (0 \
| (uint16)(-(uint16)((buf[7] >> 6) & 0x01) << 15) \
| (uint8)(+(uint8)((buf[6] >> 0) & 0xff) << 0) \
| (uint16)(+(uint16)((buf[7] >> 0) & 0x7f) << 8) \
)
#define GET_PATTERN_02_PATTERNPOINT04Y(buf) (0 \
| (uint16)(-(uint16)((buf[7] >> 6) & 0x01) << 15) \
| (uint8)(+(uint8)((buf[6] >> 0) & 0xff) << 0) \
| (uint16)(+(uint16)((buf[7] >> 0) & 0x7f) << 8) \
)
#if GET_PATTERN_01_PATTERNPOINT02Y != GET_PATTERN_02_PATTERNPOINT04Y
# error blah
#endif
Возможно ли это? Если в C++ есть какое-то решение, которое также может помочь. Но макросы фиксированы.
Нет, потому что препроцессор запускает [в отдельной фазе] (http://en.cppreference.com/w/c/language/translation_phases) из остальной части процесса компиляции, то есть он не знает о таких вещах, как переменные или другие вещи времени выполнения. , –
Да, я знаю о фазах. Я думал, может быть, у кого-то есть какой-то подрыв. не важно правильно разобрать выражение. его нормально, если сравнения не выполняются, если только белые пробелы различны, поскольку генератор будет выдавать точно такой же код. –
Нет, потому что ваши функции - это макросы в стиле функции. Вы можете делать то, что вы предлагаете другим, но вы не можете расширять макросы в стиле функции без правильного количества аргументов. –