c – 如何重新保护数组定义不完整的非零值初始化?

前端之家收集整理的这篇文章主要介绍了c – 如何重新保护数组定义不完整的非零值初始化?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个全局数组,它由一个枚举的值索引,它具有表示数值的元素.数组必须由一个特殊的值初始化,不幸的是不是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)可能有点太特殊,并且在其余部分中隐含地编码代码.

我想避免DSL和代码生成:主要构建系统是阻塞在ms窗口上,它是主要的PITA获得任何生成的东西.

解决方法

这很容易
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;版本是首选.

猜你在找的C&C++相关文章