样本代码:
int *s;
int foo(void)
{
return 4;
}
int bar(void)
{
return __atomic_always_lock_free(foo(), s);
}请求:
$ gcc t0.c -O3 -c
<nothing>
$ gcc t0.c -O0 -c
t0.c:10:10: error: non-constant argument 1 to '__atomic_always_lock_free'有什么想法吗?
相关:https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html.
发布于 2022-04-09 15:34:56
这似乎并不奇怪。您所链接的文档指出,"size必须解析为编译时常量“,因此在传递foo()时可能会出现错误。然而,典型的情况是,如果GCC能够在编译时确定表达式的值,那么它就会将其视为编译时常数,即使它不符合语言对常量表达式的基本定义。这可以被认为是一个扩展,并且在6.6p10被C17标准显式地允许。
优化级别与编译器在试图在编译时计算表达式时所尝试的内容有关。在关闭优化之后,它所做的仅仅是标准所需的基本常量折叠(例如2*4)。通过优化,您可以获得它的全部常量传播传递以及函数内联的好处。
因此,本质上,在-O0下,编译器没有注意到foo()总是返回相同的值,因为您已经禁用了允许它得出这个结论的优化。对于-O3,它是这样做的,因此它接受它作为一个常量。
https://stackoverflow.com/questions/71809210
复制相似问题