gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:46:24 31 4
gpt4 key购买 nike

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

我有一个几乎可行的解决方案,据我所知,它应该可行。

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

假设我们想在调用 uart(port) 时检查 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++ patch遗憾的是,它还没有进入发行版。

关于GCC 常量函数输入的编译时检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9441348/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com