对静态数组的初始化列表大小错误发出警告
Issue warning for wrong size of initialiizer list of static array
非常简短:如何在gcc和/或VS中为以下代码启用警告:
const int array[4] = {1, 2};
长版本:我有一个具有常量属性的表。基本上,它定义了两个"对象"如何交互。为此,我有一个有3个维度的表:环境,第一对象,第二对象。有3种不同的环境(enum)和~20个对象。所以这个数组看起来像:
const int property[3][20][20] = {{{...}}, {{...}}, {{...}}};
(在实际代码中,3和20是枚举的实际计数常数。也可以将整型转换为enum,但这不是重点。)
因此,对属性[e][t1][t2]的访问意味着:我应该如何处理环境e中的会议t1->t2 ?注意,这通常不同于t2->t1!
实际上,我更喜欢那些对未使用的enum成员发出警告的开关,但在这种情况下,开关将被嵌套3次,因此非常冗长/庞大。
如果有人能想出更好的办法,我就接受。在此之前,如果我没有填充数组元素,我希望至少有一个警告。提供小于数组大小的初始化式是一种广泛使用的特性。编写如下代码
int array[100] = {0};
是默认初始化所有数组元素的常用方法。目前,gcc没有提供一个开关来警告这个问题。
一个只适用于顶级数组的解决方案是使用static_assert
,并删除显式大小,如下所示:
const int array[] = {1, 2, 3, 4};
// ^^
// No explicit size
// Check the size here:
static_assert(sizeof(array)/sizeof(array[0]) == 4, "Expected four elements");
这样,如果数组的初始化项的数量不等于您期望的数量(即四个),您将获得编译时错误。
您可以创建一个瘦int
包装器,给它一个构造函数,并使用该包装器类型的数组。这不仅会给你一个警告,甚至一个错误:
struct Integer
{
Integer(int i) : i(i) {}
int i;
};
int main()
{
const Integer array[4] = {1, 2};
}
VC错误:error C2073: 'array' : elements of partially initialized array must have a default constructor
GCC错误:
error: no matching function for call to 'Integer::Integer(<brace-enclosed initializer list>)'
如果使用这种解决方案,那么还可以考虑使用转换操作符:
struct Integer
{
Integer(int i) : i(i) {}
int i;
operator int() const { return i; }
};
void f(int x) {}
int main()
{
const Integer array[4] = {1, 2, 3, 4};
f(array[0]);
}
相关文章:
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- G++ 编译器未为未定义的方法生成错误/警告
- 一个语句中没有多个 cout 的错误/警告
- Clang:覆盖之前在命令行上指定的所有警告和错误警告标志
- 放置新位置的错误警告
- Xcode 8.3.2 中的错误警告:文件的非可移植路径 - 指定的路径与磁盘上的文件名不同
- 编译错误:(警告:控制到达非空函数 [-wreturn 类型] 的末尾)
- snprintf:相同的代码-在不同的g++编译器上有不同的错误/警告
- 有没有办法自定义编译错误/警告消息
- 获取错误:警告C4715::并非所有控制路径都返回值,但不确定原因
- 导致.exe错误警告
- 如何在 SysntasticCheck for vim 中显示所有" g++ -Wall "错误警告?
- 开发基本的C++代码+检查错误/警告
- 如何使g++为int i=i生成错误/警告
- 我得到以下错误:[警告]多字符字符常量
- C++错误:警告:多字符字符常量/a用于用法
- C++ 在开关中隐式跌倒时强制编译时错误/警告
- 打印矩阵时,C ++程序停止,没有错误警告
- Xcode typedef 的 struct 创建错误/警告
- 主函数给出错误警告