检查预处理器宏是否为C字符串?

时间:2015-04-12 21:45:28

标签: c++ c-preprocessor

我有一些看起来像这样的C ++代码:

std::string DataDirHelper(const std::string& file) {    
  #ifndef CRYPTOPP_DATA_DIR
    return file;
  #else
    std::string dataDir(CRYPTOPP_DATA_DIR);
    ...
  #endif
}

有没有办法测试CRYPTOPP_DATA_DIR是否为C-stirng(而不是int)?

如果是这样,我该怎么做?

1 个答案:

答案 0 :(得分:3)

最简单的解决方案是:

std::string DataDirHelper(const std::string& file) {    
  #ifndef CRYPTOPP_DATA_DIR
    return file;
  #else
    std::string dataDir("" CRYPTOPP_DATA_DIR);
    ...
  #endif
}

CRYPTOPP_DATA_DIR是字符串文字时,编译器会将其与相邻的空字符串合并。当它不是字符串文字时,如果宏足够糟糕(带有一些引导逗号而不是那些),它仍然可以编译。

或者,我们可以使用static_assert要求字符串文字作为参数的要求。因此,我们可以编写这段代码:

std::string DataDirHelper(const std::string& file) {    
    static_assert(true, CRYPTOPP_DATA_DIR);
    std::string dataDir("" CRYPTOPP_DATA_DIR);
    ...
}

如果CRYPTOPP_DATA_DIR不是字符串文字,您会看到如下错误消息:

foo.cc:12:9: error: expected string literal
static_assert(true, CRYPTOPP_DATA_DIR);
                    ^~~~~~~~~~~~~~~~~