错误:可能无法初始化可变大小的对象
#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的编译器说了两件事:
- 可变大小的对象可能无法初始化:是因为在宏中使用M和L定义N还是因为我无法初始化类型为 arr [x]的数组,其中x在任何情况下都是可变的?
- 数组初始值设定项中的多余元素 – 这是什么意思?
因为我无法初始化类型为arr [x]的数组,其中x是可变的?
实际上,在C99之前,数组大小必须是一个常量表达式 。 在C99中,使用可变长度数组放宽了这一点。
(这与宏无关。)
数组初始值设定项中的多余元素 – 这是什么意思?
解决第一个问题,这应该消失。
示例中的数组大小由N
指定,该值不是常量。 这意味着您的数组是VLA(可变长度数组)。 C语言不允许VLA声明中的初始化器。
为了编译它, N
必须将我变成一个常数(因为M
和L
是常数, N
也可以是常数)。 使用#define
声明N
或作为枚举成员。
如果我没记错的话,
char s [N]={'1','2'};
N需要是常数