VSC++数组显式初始化式

VSC++ explicit initializer for arrays

本文关键字:初始化 数组 VSC++      更新时间:2023-10-16

我已经将一个c++项目从MinGW编译器移植到Visual Studio c++。我有一个类的私有属性:

bool hisStateTable[HIS_STATES][HIS_STATES] =
{   // the rows and cols represent the state for His: OFF, SAFE, Boot Boot Maintenance, Low Voltage Engineering, High Voltage Standby, Test Science, Normal Science, Burst Science
    { false, false, true, false, false, false, false, false, false }, // OFF state table
    { false, true, true, false, true, false, false, false, false },   // Safe state table
    { false, false, false, true, true, false, false, false, false },  // Boot state table
    { false, false, false, true, true, false, false, false, false },  // Boot_Maint state table
    { false, false, false, false, true, true, false, false, false },  // LV_Engin state table
    { false, false, false, false, true, true, true, true, false },    // HW_Sdby state table
    { false, false, false, false, false, true, false, false, false }, // Test_Sc state table
    { false, false, false, false, false, true, false, true, true },   // Normal_Sc state table
    { false, false, false, false, false, false, false, true, false }  // Burst_Sc state table
};

但是当我编译它时出现以下错误:

cannot specify explicit initializer for arrays

显示的语法是有效的c++。它被称为list-initialization,在n3797 S8.5.4中有描述。它可以在许多不同的情况下使用。

我找不到具体提到哪些类型的数组可以用这种方式初始化。它当然可以用于在文件范围内声明的数组和在函数中声明的局部数组。也许更熟悉标准的人可以指出标准在哪里处理非静态成员数组的list初始化。类成员的初始化在S9.2中提到。也许在不同的c++版本之间,细节发生了变化。

假设(至少对于您正在使用的编译器)这是不允许的,您几乎没有选择,只能在构造函数中初始化数组。您可以创建一个局部变量并在构造函数中对其进行记忆重载,或者您也可以在文件范围内声明一个静态数组。

static bool hisStateTable_static[HIS_STATES][HIS_STATES] = {
  // omitted
};
SomeClass::SomeClass(void) {
  assert(sizeof(hisStateTable_static) == sizeof(_state_table));
  memcpy(_state_table, hisStateTable_static, sizeof(_state_table));
}

这是最简单的代码,依赖最少,但不一定是最好的方法。

请注意,编译器会检查你的初始化项是否太多,但如果你的初始化项太少,它会提供额外的零。