错误:可能无法初始化可变大小的对象

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

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

实际上,在C99之前,数组大小必须是一个常量表达式 。 在C99中,使用可变长度数组放宽了这一点。

(这与宏无关。)

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

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

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

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

如果我没记错的话,

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

N需要是常数