Как вызвать функцию constexpr из директивы препроцессора #if? - PullRequest
1 голос
/ 04 апреля 2020

Я хочу определить макрос как строку и позже во время компиляции включить код, основанный на сравнении строк:

#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 находится за пределами функции на верхнем уровне файла ... и я забыл упомянуть, что в моем реальном коде это так.

1 Ответ

7 голосов
/ 04 апреля 2020

Это невозможно сделать таким образом.

Но вы можете использовать, если 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-способный код

...