C语言const变量作数组长度及修改该变量报错问题咨询
问题解答
这两个报错并不矛盾,是C语言对const关键字、数组长度、左值修改的三类不同语法规则共同作用的结果:
- 第一个报错
expression must have a constant value的原因
C标准要求普通定长数组的长度必须是编译期可确定的整数常量表达式,常见的符合要求的包括数字字面量、#define定义的宏常量、枚举常量。const修饰的变量本质还是变量,它的只读限制是运行期生效的,仅保证程序运行过程中该变量的值不会被修改,编译期编译器不会默认将它识别为常量,因此无法满足定长数组的长度要求。
补充说明:如果你使用C99及更高标准编译,且编译器支持变长数组(VLA)特性,第一个报错不会出现,变长数组允许用变量定义数组长度,长度在运行时确定。但部分编译器(如MSVC)默认关闭变长数组支持,因此会抛出该报错。 - 第二个报错
expression must be a modifiable lvalue的原因const关键字的核心作用就是将修饰的变量标记为只读,语法层面禁止对const修饰的左值做赋值操作,这个检查和第一个报错的逻辑完全独立:不管你有没有将k用作数组长度,只要你尝试修改const变量的值,编译器都会抛出该错误。
修复方案
如果需要用常量作为数组长度,可选择两种方案:
- 使用宏定义替换const变量:
#include <stdio.h> #define K 7 int main(void) { int a[K]; // 后续逻辑 return 0; }
- 使用枚举常量:
#include <stdio.h> int main(void) { enum { K = 7 }; int a[K]; // 后续逻辑 return 0; }
以上两种方案定义的K都是编译期可确定的常量,同时不存在被意外修改的问题。
内容的提问来源于stack exchange,提问作者Hangyeol Yoo
相关产品推荐
相关产品推荐

