有没有办法在另一个类似函数的宏中使用预处理器宏?

时间:2013-05-31 19:46:41

标签: c macros clang c-preprocessor

我找到了一个简洁的Clang特有的功能,可以让你知道在实际包含它之前是否存在标题(__has_include)。我试图想出自己的宏来做类似以下的事情:

#define DOES_HEADER_EXIST(_header_)      \
#if !__has_include(_header_)             \
#warning Header not found: _header_      \
#endif

但这似乎不起作用。我可以看出为什么这不起作用,因为它有点像要求预处理器做两次通过,但也许我错了?

2 个答案:

答案 0 :(得分:5)

无法创建一个宏,该宏将扩展为预处理器指令,预处理器将实际执行该操作。

您的特定宏存在缺陷,因为如果编译器允许#if后跟一个令牌,它会扩展为一条被认为是格式错误的#指令的长行。不是一个宏参数。

要做你想做的事,你需要一个预处理器,在你真正编译代码之前注入你想要执行的测试。

答案 1 :(得分:2)

不幸的是,您可以在宏中使用宏,但不能使用预处理器关键字。