非常简短:我如何在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次,因此非常冗长/巨大。
如果有人能想出更好的东西,我会接受它。直到那时,如果我错过填充数组元素,我至少会发出警告。
答案 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]);
}