c++ - 如何从 #define 中删除 C 风格的转换,以便我可以在预处理器 #if 中使用它?

标签 c++ preprocessor-directive

我想使用以下预处理器定义:

[第 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/

相关文章:

C++:用于上下并行前缀计算的线程池

c++ - 在 directX 11.1 中加载纹理

c++ - 有没有Makefile依赖的 "watch"/"monitor"/"guard"程序?

c - 在 C 中替换宏中的宏

c++ - 显式覆盖虚函数

c++ - 类函数和命名空间之间重新声明的符号

Monodevelop 将 #if 和 #endif 之间的所有内容标记为 C# 文件中的注释

c++ - 是否在扩展宏之前处理预处理器指令?

c# - 目标框架符号未定义

swift - 如何在 swift 2.3 中使用#undef 指令