我有一个全局数组,它由一个枚举的值索引,它具有表示数值的元素.数组必须由一个特殊的值初始化,不幸的是不是0.
enum { A,B,C,COUNT }; extern const int arr[COUNT];
在.cpp文件中:
const int arr[COUNT] = { -1,-1,-1 };
枚举有时会更改:添加新值,有些被删除.我刚刚修复的代码中的错误是初始化值不足,导致数组的其余部分用零初始化.我想对这种错误做出保护.
问题是要确保arr始终使用特殊值(示例中为-1)完全初始化,或者打破编译以使开发人员注意,因此可以手动更新数组.
最近的C标准是不可用的(旧的ms编译器和一些专有的垃圾).可以在一定程度上使用模板.强烈禁止STL和Boost(不要问),但我不介意复制或重新实现所需的部件.
如果事实证明是不可能的,我将不得不考虑将特殊值更改为0,但是我想避免:特殊值(-1)可能有点太特殊,并且在其余部分中隐含地编码代码.
解决方法
这很容易
enum { A,COUNT }; extern const int (&arr)[COUNT]; const int (&arr)[COUNT] = (int[]){ -1,-1}; int main() { arr[C]; }
乍看起来,这似乎产生了开销,但是当您仔细检查它时,只需编译器关心的同一个变量就可以生成两个名称.所以没有开销.
这里工作:http://ideone.com/Zg32zH,这里是错误的情况发生了什么:http://ideone.com/yq5zt3
prog.cpp:6:27: error: invalid initialization of reference of type ‘const int (&)[3]’ from expression of type ‘const int [2]’
对于某些编译器,您可能需要将临时命名
const int arr_init[] = { -1,-1}; const int (&arr)[COUNT] = arr_init;
更新
我已经被通知第一个=(int []){ – 1,-1}版本是一个编译器扩展,所以第二个= arr_init;版本是首选.