实时检查恒定功能输入

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

我有一个几乎可以工作的解决方案,就我所知,它应该可以工作。

注意:__builtin_constant_p(表达式)应该在编译时返回一个表达式是否是一个常量。

假设我们想在调用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

有任何想法吗?


你的代码可以用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 ++补丁可惜没有进入发行版。


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

什么是 ”:-!!” 在C代码?

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

链接地址: http://www.djcxy.com/p/73563.html

上一篇: time checking of constant function inputs

下一篇: Why does double negation force values to become a bool?