在下面的代码a
数组中使用s
“seed”变量初始化,这显然不是常量表达式(因为它被评估为“运行时”):
#include <stdio.h>
int main(void)
{
int s = 1, i;
int a[] = {s, s + 2, s + 4, s + 6, s + 8};
for (i = 0; i < (int) (sizeof a / sizeof a[0]); i++)
printf("%d ", a[i]); /* prints: 1 3 5 7 9 */
putchar('\n');
return 0;
}
它在gcc -Wall -Wextra
中编译,没有任何警告。但是添加-pedantic
会引发:
check.c: In function ‘main’:
check.c:8: warning: initializer element is not computable at load time
check.c:8: warning: initializer element is not computable at load time
check.c:8: warning: initializer element is not computable at load time
check.c:8: warning: initializer element is not computable at load time
check.c:8: warning: initializer element is not computable at load time
C是否需要对初始化元素进行常量表达式?
答案 0 :(得分:7)
这在c99中有效,但在c89中无效(强调我的):
(C89,6.5.7)&#34;具有静态存储持续时间的对象的初始化程序中的所有表达式或具有聚合或联合类型的对象的初始化程序列表中的所有表达式是常数表达式&#34;
但
(C99,6.7.8p4)&#34;具有静态存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字。&#34;
默认情况下,gcc
使用-std=gnu89
编译,这是c89 + GNU扩展。
答案 1 :(得分:2)
除了ouah的优秀答案,我还要补充一点,C99需要在 designators
中对 designated initializers
进行常量表达(仅限于C99),例如以下数组初始化在C99中无效:
int s = 1, i = 0;
int a[] = {[i] = s, [i+1] = s + 2, [i+2] = s + 4, s + 6, s + 8};
可能会改写为例如:
#define I 0
int s = 1, i;
int a[] = {[I] = s, [I+1] = s + 2, [I+2] = s + 4, s + 6, s + 8};