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

时间:2012-02-25 04:52:22

标签: gcc constants compile-time

如果编译器知道它们是常量,我想使用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

有什么想法吗?

2 个答案:

答案 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)

您可以尝试Linux内核中使用的技巧:

What is ":-!!" in C code?

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