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