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
对于某些编译器,您可能需要将临时命名 const int arr_init[] = { -1,-1}; const int (&arr)[COUNT] = arr_init; 更新 我已经被通知第一个=(int []){ – 1,-1}版本是一个编译器扩展,所以第二个= arr_init;版本是首选. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |