检查表达式

时间:2016-08-03 13:34:12

标签: c++ c-preprocessor

动机:我试图根据是否定义某个宏来定义模板参数。如果定义了宏,模板将选择不同的专业化。我可以将整个专业化放在一个巨大的#ifdef中,但我正在寻找一种更简单的方法。

问题:有没有办法检查表达式中是否定义了宏,即不使用#ifdef?这就是我的意思:

int main()
{
    std::cout << CHECK(macro) << " should print 0\n";
#define macro
    std::cout << CHECK(macro) << " should print 1\n";
#undef macro
#define macro 1
    std::cout << CHECK(macro) << " should print 1\n";
#undef macro
#define macro ""
    std::cout << CHECK(macro) << " should print 1\n";
#undef macro
    std::cout << CHECK(macro) << " should print 0\n";
}

到目前为止,我有两个选项,这是在运行时:

#define CHECK_HELPER(x, y) (strcmp(#x, y) != 0)
#define CHECK(x) CHECK_HELPER(x, #x)

这是在编译时完成的,但不是很好:

#define CHECK_HELPER(...) (#__VA_ARGS__[0] == '1' || #__VA_ARGS__[0] == '\0')
#define CHECK(...) CHECK_HELPER(__VA_ARGS__)

0 个答案:

没有答案