VSC ++显式初始化器用于数组

时间:2014-05-15 13:49:57

标签: c++ arrays visual-c++

我已经将MinGW编译器的C ++项目移植到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

1 个答案:

答案 0 :(得分:0)

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

我一直无法找到可以通过这种方式初始化哪种阵列的具体提及。它当然可以用于在文件范围声明的数组和在函数中声明的本地数组。也许更熟悉标准的人可以指出标准处理非静态成员数组的列表初始化的位置。在S9.2中提到了类成员的初始化。也许C ++版本之间的细节已经发生了变化。

假设(至少对于你正在使用的编译器)这是不允许的,你别无选择,只能在构造函数中初始化数组。您可以在构造函数中创建一个局部变量并将其memcpy,或者您可以使用在文件范围内声明的静态数组执行相同的操作。

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));
}

这是最简单的代码,具有最少的依赖关系,不一定是最好的方法。

请注意,编译器会检查您没有太多的初始化程序,但如果您的初始化程序太少,它将提供额外的零。