GCC编译时检查常量函数输入

GCC编译时检查常量函数输入,gcc,constants,compile-time,Gcc,Constants,Compile Time,如果编译器知道函数输入是常量,我想使用gcc对它们进行编译时检查 我有一个几乎可行的解决方案,就我所见,它应该可行 注意:\内置\常量\ p(表达式)应该返回一个表达式在编译时是否为常量 假设我们想检查端口是否可以尝试Linux内核中使用的技巧: (有点可怕)Linux内核宏对参数中允许的表达式类型没有那么严格。您的代码适用于g++(GCC)4.8.2 -但是,正如您正确指出的那样,优化是不行的 要是我们能用它就好了 static_assert(__builtin_choose_expr(__

如果编译器知道函数输入是常量,我想使用gcc对它们进行编译时检查

我有一个几乎可行的解决方案,就我所见,它应该可行

注意:\内置\常量\ p(表达式)应该返回一个表达式在编译时是否为常量


假设我们想检查端口是否可以尝试Linux内核中使用的技巧:

(有点可怕)Linux内核宏对参数中允许的表达式类型没有那么严格。

您的代码适用于g++(GCC)4.8.2

-但是,正如您正确指出的那样,优化是不行的

要是我们能用它就好了

static_assert(__builtin_choose_expr(__builtin_constant_p(port), \
                          port<2, 1), "parameter port must be < 2")
静态断言(\uuuuuBuiltin\uChoose\uExpr(\uuuBuiltin\uConstant\uP(端口)\

portThe“出于某种原因”是“constant expression”的形式语法没有针对
运算符的规则,该规则表示“如果左侧在编译时可证明为
false
,则第二个参数不必是常量表达式。”而“constant expression”的语法表示“所有组件”(即使是在求值时没有使用的表达式)也必须是常量表达式。“这就是为什么错误消息说“不能出现在常量表达式中”,而不是“不能出现在常量表达式的求值部分。”嗯……你是对的,它遵守了我的要求,但实际上没有达到我想要的效果,因为我忘了添加编译器优化参数:我现在添加了“-Os”,它很好地再现了这个问题。
c:\>gcc a.cpp -std=c++0x -Os
a.cpp: In function 'int main()':
a.cpp:13: error: 'x' cannot appear in a constant-expression
static_assert(__builtin_choose_expr(__builtin_constant_p(port), \
                          port<2, 1), "parameter port must be < 2")