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

Check that preprocessor macro is a C-string?

本文关键字:字符串 是否 预处理 处理器 检查      更新时间:2023-10-16

我有一些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)?

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

最简单的解决方案是:

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);
                    ^~~~~~~~~~~~~~~~~