VS2015社区版Win10环境下C语言const数组编译报错咨询
问题解答:VS2015 C语言中const常量无法作为数组大小的原因及解决办法
嗨,这个问题其实是C语言标准特性和Visual Studio 2015编译器默认行为的差异导致的,我给你一步步理清楚:
核心原因:C语言里的const变量≠编译期常量表达式
你可能混淆了C和C的特性——在C中,用常量表达式初始化的const变量会被视为编译期常量,但C语言(尤其是C89/90标准)完全不是这样:
- 被
const修饰的变量只是“运行时不可修改”的变量,它不属于C标准定义的「整数常量表达式」,而栈上静态数组的大小要求必须是整数常量表达式才能在编译期确定内存分配。 - 不管是
size_t const、int const,也不管数组是wchar_t还是char,本质都是同一个问题:const变量在C89里不被认可为数组大小的合法常量。
为什么VS2015会报错?
Visual Studio 2015的C语言编译器默认遵循C89(ANSI C)标准,而C89不支持「变长数组(VLA)」——变长数组是C99标准才引入的特性,允许用运行时确定的值作为数组大小。VS直到VS2019之后才开始有限支持C99的部分特性,所以VS2015根本不买const变量当数组大小的账。
解决办法
这里给你几个可行的方案,按需选择:
1. 用预编译宏定义(最稳妥的编译期常量)
宏是真正的编译期替换,完全符合C89对数组大小的要求:
#include <stdio.h> #define NELEM 10 // 宏定义的常量,编译期直接替换 void main() { wchar_t arr[NELEM]; // 正常使用数组 }
2. 动态内存分配(灵活适配运行时大小)
如果你的数组大小需要在运行时确定,或者不想用宏,可以用malloc/free手动管理内存:
#include <stdio.h> #include <stdlib.h> void main() { size_t const nelem = 10; wchar_t *arr = malloc(nelem * sizeof(wchar_t)); // 动态分配内存 if (arr != NULL) { // 一定要检查分配是否成功 // 使用数组的逻辑 free(arr); // 用完记得释放内存,避免内存泄漏 } }
3. 尝试切换到C99模式(VS2015支持有限,谨慎使用)
在VS2015的项目属性里,你可以尝试强制启用C99支持:
- 右键项目 → 属性 → 配置属性 → C/C++ → 语言 → 把「C语言标准」改成「ISO C99标准(/TC)」
- 注意:VS2015对C99的支持并不完整,可能会出现其他兼容性问题,所以这个方案优先级低于前两个。
内容的提问来源于stack exchange,提问作者RyeBread
相关产品推荐
相关产品推荐

