我想使用以下预处理器定义:
[第 3 方 header (无法修改)]
#define SWCI_VERSION_MAJOR (unsigned char) 4
#define SWCI_VERSION_MINOR (unsigned char) 16
这样比较时:
[我的实现]
#if SWCI_VERSION_MAJOR >= 4 && SWCI_VERSION_MINOR >= 16
然后我得到:
fatal error C1017: invalid integer constant expression
我注意到,如果我在不使用 (unsigned char) 的情况下定义它们,指令将被接受,但我无权访问定义,因此我想尽可能解决该问题。
最佳答案
你可以通过一点预处理器魔法来让它工作。由于预处理器应用宏的方式,您有时可以使用多个宏级别进行一些修改。 Boost.Preprocessor 利用了这种行为。这段代码利用了这样一个事实,即 (unsigned char)
看起来可以通过在宏名称 X
前面添加一个宏调用来实现,它的计算结果为空,只留下尾随数。
#define SWCI_VERSION_MAJOR (unsigned char) 4
#define SWCI_VERSION_MINOR (unsigned char) 16
#define X(unused)
#define APPLY(x) x
#define MAJOR (APPLY(X SWCI_VERSION_MAJOR))
#define MINOR (APPLY(X SWCI_VERSION_MINOR))
#if MAJOR >= 4 && MINOR >= 16
#error "Version is greater or equal to 4.16"
#endif
参见 https://goo.gl/GOsLDL例如,#if
评估 true 并打印我添加的 #error
消息。
关于c++ - 如何从 #define 中删除 C 风格的转换,以便我可以在预处理器 #if 中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35604038/