如何从预处理器 #if 指令调用 constexpr 函数?
How to call a constexpr function from a preprocessor #if directive?
我想将宏定义为字符串,稍后在编译时包含基于字符串比较的代码:
#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
在文件顶层的函数之外。我忘了在我的真实代码中提到这种情况。
这是不可能的。
但是你可以像这样使用 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;
}
我想将宏定义为字符串,稍后在编译时包含基于字符串比较的代码:
#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
在文件顶层的函数之外。我忘了在我的真实代码中提到这种情况。
这是不可能的。
但是你可以像这样使用 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;
}