3

我正在使用聚合初始化程序为单元测试设置一块静态数据。

我想使用数组大小​​作为预期的元素数量,但如果提供的初始化程序太少,这可能会失败:

my_struct_type expected[14] =
{
    { 1.234, 0, 'c' },
    { 3.141, 1, 'z' },
    { 2.718, 0, 'a' }
};

这在 Visual Studio 2008 中不会出现编译器错误。

我希望能够这样使用它:

const unsigned expected_size = sizeof(expected) / sizeof(my_struct_type);

BOOST_CHECK_EQUAL(points.size(), expected_size);

for( int i = 0; i < expected_size; i++ )
{
    BOOST_CHECK_EQUAL(points[i].value, expected[i].value);
    BOOST_CHECK_EQUAL(points[i].count, expected[i].count);
    BOOST_CHECK_EQUAL(points[i].sym,   expected[i].sym);
}

但是因为我没有 14 点的编译时保证,所以这会从所提供值的数组末尾结束并进入默认初始化值。

我可以在编译时以某种方式强制执行聚合数组初始值设定项的数量吗?

4

5 回答 5

5

实际上它不会在数组的末尾运行,因为编译器会默认初始化数组中您没有自己初始化的所有元素。

如果您试图确保配置了特定数量的初始化程序,我不知道该怎么做。

如果您只想确保数组是您拥有的项目数:

my_struct_type expected[] =
{
    { 1.234, 0, 'c' },
    { 3.141, 1, 'z' },
    { 2.718, 0, 'a' }
};

会成功的。然后只需使用sizeof(expected) / sizeof(expected[0])来获取数组元素的总数。

于 2010-09-07T15:15:18.383 回答
4

第一:可能会有一个警告。您是否尝试过以最高警告级别进行编译?

然后:如果交换计算的值和字面量的值,则可能会引发编译时错误:

my_struct_type my_array[] = // <== note the empty []
{
    { 1.234, 0, 'c' },
    { 3.141, 1, 'z' },
    { 2.718, 0, 'a' }
};

BOOST_STATIC_ASSERT( sizeof(my_array)/sizeof(my_array[0]) == 14 );
于 2010-09-07T15:12:15.453 回答
1

只是为了一个非 Boost 答案......</p>

您可以通过修改来添加初始化要求my_struct_type

template< typename T >
struct must_be_initialized {
    T value;

    must_be_initialized( T const &v ) : value( v ) {}
     // no default constructor!

    operator T& () { return value; }
    operator T const& () const { return value; }
};

struct my_struct_type {
    must_be_initialized< double > f;
    int i;
    char c;
};

my_struct_type expected[14] =
{
    { 1.234, 0, 'c' },
    { 3.141, 1, 'z' },
    { 2.718, 0, 'a' }
     // error: no default constructor exists
};

my_struct_type仍然是聚合,但不是 POD。

于 2010-09-07T16:30:12.403 回答
1

ISO/IEC 14882(第一版 1998-09-01),第 8.5.1.7 规定如下:

如果列表中的初始化器少于聚合中的成员,则每个未显式初始化的成员都应默认初始化(8.5)。[示例:结构 S { int a; 字符* b; 诠释 c; }; S ss = { 1, "asdf" }; 用 1 初始化 ss.a,用“asdf”初始化 ss.b,用 int() 形式的表达式的值(即 0)初始化 ss.c。]

简单地说,你的问题的答案是否定的。

于 2010-09-07T17:00:17.870 回答
0

根据msdn,如果指定的初始值设定项较少,则剩余元素将初始化为 0,因此代码仍然可以工作。

于 2010-09-07T15:04:57.897 回答