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

发布于 2025-01-18 03:53:57 字数 827 浏览 0 评论 0原文

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

#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 位于文件顶层的函数之外。我忘了提及,在我的真实代码中就是这种情况。

I want to define a macro as a string and later at compile time include code based on string comparison:

#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;
}

Compiling this with

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

gives error:

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

Edit:

It appears that it matters if the #if directive is inside a function or not, since if it is inside a function we can replace it with if constexpr (...) { ... } But that is not possible if the #if is outside a function in the top level of a file.. and I forgot to mention that in my real code that is the case.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

恬淡成诗 2025-01-25 03:53:57

这是无法做到的。

但是您可以使用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代码

This is not possible to do this way.

But you can use if constexpr like this.

#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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文