如何从预处理器#if指令中调用constexpr函数?
我想将宏定义为字符串,然后在编译时包含基于字符串比较的代码:
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是无法做到的。
但是您可以使用constexpr。
run-able代码
This is not possible to do this way.
But you can use if constexpr like this.
Run-able Code