C是否允许在数组初始化列表中使用非const表达式?

时间:2014-06-21 12:06:23

标签: c

在下面的代码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是否需要对初始化元素进行常量表达式?

2 个答案:

答案 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};