1
#define L 1
#define M L+1

int main(void){

    int N=L*M*2;
    char s [N]={'1','2'};
    printf("%d", sizeof(s));

    return 1;   
}

为什么上面的代码无法编译?Eclipse 的编译器说了两件事:

  1. 可变大小的对象可能无法初始化:是因为在宏中定义了 N 与 M 和 L 还是因为我无法初始化类型为arr[x] 的数组,其中 x 在任何情况下都是可变的?
  2. 数组初始值设定项中的多余元素- 这是什么意思?
4

3 回答 3

1

因为我无法初始化类型为 arr[x] 的数组,其中 x 是可变的?

事实上,在 C99 之前,数组大小必须是一个常量表达式。在 C99 中,这已通过变长数组放宽。

(这与宏无关。)

数组初始值设定项中的多余元素 - 这是什么意思?

解决第一个问题,这应该会消失。

于 2012-07-19T14:10:13.940 回答
1

您的示例中的数组大小由 指定N,它不是常量。这意味着您的数组是 VLA(可变长度数组)。C 语言不允许在 VLA 声明中使用初始值设定项。

为了编译N它,我必须把它做成一个常数(因为ML是常数,N也可以是常数)。声明N使用#define或作为枚举成员。

于 2012-07-19T14:15:56.907 回答
0

如果我没记错的话

char s [N]={'1','2'};

N 必须是常数

于 2012-07-19T14:11:33.123 回答