实时检查恒定功能输入
如果编译器知道它们是常量,我想使用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?