如何从预处理程序#if指令中调用constexpr函数?

问题描述 投票:1回答: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在函数外部,则不可能实现)文件的最高级别..我忘了在实际代码中提到这种情况。

我想将宏定义为字符串,然后在编译时包含基于字符串比较的代码:#include #include constexpr bool strings_equal(char const ...

c++ c++17 constexpr string-view
1个回答
5
投票

这不可能这样做。

但是您可以像这样使用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;
}

Run-able Code

© www.soinside.com 2019 - 2024. All rights reserved.