如果编译器知道它们是常量,我想使用gcc对函数输入进行一些编译时检查。
我有一个非常的解决方案,据我所知,它应该可行。
注意:__ builtin_constant_p(expression)应该返回表达式在编译时是否为常量。
假设我们要在调用uart(port)时检查端口是否为< 2,则以下代码应该有效:
#include <stdio.h>
void _uart(int port) {
printf("port is %d", port);
}
#define uart(port) \
static_assert(__builtin_constant_p(port)? port<2: 1, "parameter port must be < 2"); \
_uart(port)
int main(void) {
int x=1;
uart(x);
}
这在调用uart()时有效。不幸的是,它不适用于非常数x。由于某种原因,static_assert无法处理x不是常量的情况,即使理论上__builtin_constant_p()甚至不会传递常量。我得到的错误信息是:
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
有什么想法吗?
答案 0 :(得分:2)
您的代码适用于g ++(GCC)4.8.2。
- 但没有优化,正如您所正确指出的那样。
如果我们只能使用
static_assert(__builtin_choose_expr(__builtin_constant_p(port), \
port<2, 1), "parameter port must be < 2")
- 但遗憾的是__builtin_choose_expr
构造目前仅适用于C。
然而,有C++ patch遗憾地没有进入发布版本。
答案 1 :(得分:1)