我需要编写一些代码来验证宏是否已定义但是为空(没有任何值)。测试不需要在编译时。
我试着写:
#if (funcprototype == "")
MY_WARN("funcprototype is empty");
#endif
代码无法编译,因为funcprototype
扩展为空。
答案 0 :(得分:5)
如果运行时检查没问题,那么您可以测试字符串替换的长度:
#define REAL_STRINGIZE(x) #x
#define STRINGIZE(x) REAL_STRINGIZE(x)
if (STRINGIZE(funcprototype)[0] == '\0') {
// funcprototype expanded to an empty replacement list
}
else {
// funcprototype expanded to a non-empty replacement list
}
我认为没有一般情况“这个宏被一个空的令牌序列替换”编译时检查。这是一个类似的问题,“是否有可能比较两个令牌序列的相等性”,这在编译时是不可能的。