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

前端之家收集整理的这篇文章主要介绍了c – 如何从#define中删除C风格的转换,所以我可以在预处理器#if中使用它?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用以下预处理器定义:

[第三方标题(不能修改)]

#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进行宏调用,该名称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

有关#if评估true并打印我添加的#error消息的示例,请参见https://goo.gl/GOsLDL.

猜你在找的C&C++相关文章