【发布时间】:2015-03-02 17:57:01
【问题描述】:
我从一些.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++ 中有一些解决方案也可能有所帮助。但是宏是固定的。
【问题讨论】:
-
不,因为预处理器从编译过程的其余部分运行in a separate phase,这意味着它不知道变量或其他运行时间的东西。
-
是的,我知道这些阶段。我想可能有人有一些stringify hack。正确解析表达式并不重要。如果只有空格不同,则比较失败也没关系,因为生成器将生成完全相同的代码。
-
不,因为你的是函数式宏。您可以使用其他类型执行您建议的操作,但如果没有正确数量的参数,您将无法扩展函数样式的宏。
-
但是如果
buf是在运行时填写的,那么只有编译时的预处理器怎么知道里面的数据呢? -
@JoachimPileborg,我认为他想比较宏定义而不替换参数。但是不,你不能那样做。
标签: c macros c-preprocessor