c++ - 我可以在 "too few initializers"上导致编译错误吗?

标签 c++ compiler-errors aggregate initializer-list boost-test

我正在使用聚合初始化器为单元测试设置静态数据 block 。

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

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 点的编译时保证,所以它从提供的值的 end of array 结束并进入默认初始化值。

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

最佳答案

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

如果你想确保你有特定数量的配置初始化器,我不知道该怎么做。

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

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

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

关于c++ - 我可以在 "too few initializers"上导致编译错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3659839/

相关文章:

algorithm - Perl 中发生重大变化时的总计

sql - 通过分区聚合相邻行

sql - 从 SQL 中的多个数据库中选择 COUNT()

c++ - 回调和 `std::recursive_mutex` - 有效用例?

compiler-errors - 无法在 Windows 上编译 Rust hello world : linker link. 找不到 exe

QTimer : class has no constructors

perl - 如何修复 Perl 的 Font::FreeType 编译错误?

c++ - 用模板重写的类会使程序变慢(在运行时)

c++ - 将节点旋转到 BST 的根

c++ - 简单教程示例的 CUDA 段错误