You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承的遗留代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:54:00