继承的遗留代码中C语言索引指定数组初始化报C2059错误如何解决
错误原因
你用到的[下标] = 值写法是C99标准引入的指定初始化器特性,可以直接给数组的指定下标位置初始化值,GCC、Clang等编译器都原生支持该语法。
你当前使用的是微软MSVC编译器,旧版本MSVC(Visual Studio 2015及更早版本)对C99标准的支持度极低,完全不识别该初始化语法,因此抛出C2059语法错误。
解决方案
方案1:升级/切换编译器
如果可以调整编译环境,优先选择该方案:
- 使用Visual Studio 2019及以上版本,打开项目属性 →
C/C++→所有选项→C语言标准,选择/std:c11或/std:c17,即可支持指定初始化器语法 - 切换到MinGW GCC、Clang等原生支持C99的编译器,无需修改代码即可直接编译
方案2:修改代码兼容旧MSVC
如果必须兼容旧版本MSVC,需要把指定初始化写法改为传统的顺序初始化写法:
首先确定数组的最大下标是0x20(十进制32),因此数组长度需要设置为33,未显式初始化的元素会自动初始化为0,修改后代码如下:
static const UCHAR g_ReportSizes[33] = { 0, // 0x00 4, // 0x01 2, // 0x02 5, // 0x03 2, // 0x04 3, // 0x05 3, // 0x06 4, // 0x07 4, // 0x08 5, // 0x09 /* 0x0A ~ 0x13 未指定值,自动初始化为0 */ 4, // 0x14 2, // 0x15 /* 0x16 ~ 0x1F 未指定值,自动初始化为0 */ 64 // 0x20 };
如果数组下标跨度更大,顺序初始化可读性差,也可以先初始化全0数组,再通过初始化函数赋值:
// 去掉const修饰符,允许后续赋值 static UCHAR g_ReportSizes[0x21] = {0}; void initReportSizes() { g_ReportSizes[0x01] = 4; g_ReportSizes[0x02] = 2; g_ReportSizes[0x03] = 5; g_ReportSizes[0x04] = 2; g_ReportSizes[0x07] = 4; g_ReportSizes[0x09] = 5; g_ReportSizes[0x20] = 64; g_ReportSizes[0x05] = 3; g_ReportSizes[0x06] = 3; g_ReportSizes[0x14] = 4; g_ReportSizes[0x08] = 4; g_ReportSizes[0x15] = 2; }
在程序启动时调用一次initReportSizes()即可完成数组初始化。
内容的提问来源于stack exchange,提问作者David Partridge
相关产品推荐
相关产品推荐

