如何保护数组定义再次使用非零值进行不完整的初始化?

for*_*rk0 9 c++

我有一个全局数组,它由枚举的值索引,其中有一个元素表示值的数量.必须通过特殊值初始化数组,遗憾的是,该值不是0.

enum {
  A, B, C, COUNT
};

extern const int arr[COUNT];
Run Code Online (Sandbox Code Playgroud)

在.cpp文件中:

const int arr[COUNT] = { -1, -1, -1 };
Run Code Online (Sandbox Code Playgroud)

偶尔会更改枚举:添加新值,删除一些值.我刚刚修复的代码中的错误是初始化值不足,导致数组的其余部分用零初始化.我想对这种错误采取保护措施.

问题是要么保证arr始终使用特殊值(-1在示例中)完全初始化,要么打破编译以引起开发人员注意,因此可以手动更新数组.

最近的C++标准不可用(旧的ms编译器和一些专有的垃圾).可以在一定程度上使用模板.强烈禁止STL和Boost(不要问),但我不介意复制或重新实现所需的部分.

如果事实证明是不可能的,我将不得不考虑将特殊值更改为0,但我想避免这种情况:特殊值(the -1)可能有点过于特殊,并且在其余代码中隐式编码.

我想避免DSL和代码生成:主要构建系统在ms窗口上堵塞,并且它是主要的PITA来获取在那里生成的任何东西.

Col*_*nee 7

我能拿出最好的解决办法是更换arr[COUNT]arr[],然后写一个模板来断言sizeof(arr) / sizeof(int) == COUNT.这不会确保它被-1初始化,但它将确保您使用正确数量的元素显式初始化数组.

C++ 11 static_assert会更好,或者Boost的宏版本,但是如果你没有,你必须自己想出一些东西.

  • 一个便宜的C++ 98`static_assert`:`extern int array_size_check [sizeof(arr)/ sizeof(*arr)== COUNT?1:-1];` (3认同)

Moo*_*uck 5

这很简单.

enum {
  A, B, C, COUNT
};
extern const int (&arr)[COUNT];

const int (&arr)[COUNT] = (int[]){ -1, -1, -1};

int main() {
   arr[C];
}
Run Code Online (Sandbox Code Playgroud)

乍一看,这似乎会产生开销,但是当你仔细检查它时,它只会为编译器关心的同一变量生成两个名称.所以没有开销.

这是工作:http://ideone.com/Zg32zH,这是错误案例中发生的事情:http://ideone.com/yq5zt3

prog.cpp:6:27:错误:从类型'const int [2]'的表达式初始化'const int(&)[3]'类型的引用无效

对于某些编译器,您可能需要为临时命名

const int arr_init[] = { -1, -1, -1};
const int (&arr)[COUNT] = arr_init;
Run Code Online (Sandbox Code Playgroud)

更新

我被告知第一个=(int[]){-1,-1,-1}版本是编译器扩展,所以第二个=arr_init;版本是首选版本.