发出静态数组初始化列表错误大小的警告

时间:2015-08-29 11:14:07

标签: c++ arrays gcc enums initializer

非常简短:我如何在gcc和/或VS中为以下代码启用警告:

const int array[4] = {1, 2};

更长的版本:我有一个具有常量属性的表。基本上它定义了2"对象"相互作用。为此,我有一个有3个维度的表:环境,第一个对象,第二个对象。有3种不同的环境(枚举)和~20个对象。所以数组看起来像:

const int property[3][20][20] = {{{...}}, {{...}}, {{...}}};

(在实际代码3和20中是枚举的实际计数常数。也可以使int成为枚举但不是重点。)
因此,访问属性[e] [t1] [t2]意味着:我应该如何处理环境e中的会议t1-> t2?注意,这通常不同于t2-> t1!

实际上我更喜欢那些收到未使用的枚举成员警告的交换机,但在这种情况下,交换机将嵌套3次,因此非常冗长/巨大。

如果有人能想出更好的东西,我会接受它。直到那时,如果我错过填充数组元素,我至少会发出警告。

2 个答案:

答案 0 :(得分: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");

这样,如果数组的初始值设定项的数量不等于您期望的数量(即四个),则会出现编译时错误。

答案 1 :(得分:3)

您可以创建一个瘦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

海湾合作委员会错误:

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]);
}