测试C宏的值是否为空

时间:2010-11-26 18:59:50

标签: c++ c-preprocessor

我需要编写一些代码来验证宏是否已定义但是为空(没有任何值)。测试不需要在编译时。

我试着写:

#if (funcprototype == "")
MY_WARN("funcprototype is empty");
#endif

代码无法编译,因为funcprototype扩展为空。

1 个答案:

答案 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
}

我认为没有一般情况“这个宏被一个空的令牌序列替换”编译时检查。这是一个类似的问题,“是否有可能比较两个令牌序列的相等性”,这在编译时是不可能的。