GCC内置常量始终返回0

GCC内置常量始终返回0,c,gcc,C,Gcc,我有以下代码: const int a = 10; int b = __builtin_constant_p(a); printf("%d\n", b); 输出为0。 我读过这个人,0的值并不意味着a不是编译时常数,只是gcc不能证明它是。无论如何,我可以将这个输出设为1?Aconst-限定变量不是C中的常量表达式,但GCC不会将\u内置常量\u p作为确定参数是否为常量表达式的文件。相反,它是“确定一个值在编译时是否已知为常量,因此GCC可以对涉及该值的表达式执行常量折叠”。因此,它应该可以

我有以下代码:

const int a = 10;
int b = __builtin_constant_p(a);
printf("%d\n", b);
输出为0。
我读过这个人,0的值并不意味着a不是编译时常数,只是gcc不能证明它是。无论如何,我可以将这个输出设为1?

A
const
-限定变量不是C中的常量表达式,但GCC不会将
\u内置常量\u p
作为确定参数是否为常量表达式的文件。相反,它是“确定一个值在编译时是否已知为常量,因此GCC可以对涉及该值的表达式执行常量折叠”。因此,它应该可以满足您的需要


几乎可以肯定的是,问题在于您使用
-O0
(默认情况下没有优化)进行编译,在这种情况下,不会发生常量折叠,因为您关闭了它。启用优化(至少
-O1
,但通常您需要
-O2
-Os
),它应该做您想做的事情。

变量永远不是常量(除非使用常量折叠,但您必须为此启用优化),即使它是
常量

\uuuu内置常数\up
将仅对常数返回true。例如:

int b = __builtin_constant_p(10);
printf("%d\n", b);
将打印
1


请注意,如果在启用优化的情况下编译(
-O
,但除
-O0
)之外,任何其他合法的
-O
标志都将起作用),则代码也将打印
1

根据C标准,“常量表达式”不同于“常量值”<代码>\u内置常数\u p
检查常数表达式。在这里,如果不将
a
转换为宏,就无法完成您想要的操作。变量永远不会是“常量表达式”。@RichardJ.RossIII:,
\uuuu builtin\u constant\u p
不会确定操作数是否为常量表达式,而是“如果在编译时已知值为常量,因此GCC可以对涉及该值的表达式执行常量折叠”。OP可能省略了
-O
。。。