1

我想将宏定义为字符串,稍后在编译时包含基于字符串比较的代码:

#include <iostream>
#include <string_view>

constexpr bool strings_equal(char const * a, char const * b) {
    return std::string_view(a)==b;
}

#define FOO "bar"


int main() {
#if strings_equal( FOO, "bar") == 0
    std::cout << "got a bar!" << '\n';
#endif
    return 0;
}

编译这个

$ g++ -std=c++17 test.cpp -o my_test

给出错误:

test.cpp:12:18: error: missing binary operator before token "("
   12 | #if strings_equal( FOO, "bar") == 0
      |                  ^

编辑

#if指令是否在函数内部似乎很重要,因为如果它在函数内部,我们可以将其替换为但是如果它在文件顶层的函数外部if constexpr (...) { ... }是不可能的..我忘记了#if提到在我的真实代码中就是这种情况。

4

1 回答 1

7

这是不可能的。

但是你可以像这样使用 if constexpr 。

#include <iostream>
#include <string_view>

constexpr bool strings_equal(char const * a, char const * b) {
    return std::string_view(a)==b;
}

constexpr auto FOO = "bar";

int main() {
    if constexpr (strings_equal( FOO, "bar")) {
        std::cout << "got a bar!" << '\n';
    }

    return 0;
}

可运行代码

于 2020-04-04T20:24:32.890 回答