我有一些看起来像这样的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
)?
如果是这样,我该怎么做?
答案 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);
^~~~~~~~~~~~~~~~~