Могу ли я вызвать ошибку компиляции на «Слишком малоинициализаторы»?

StackOverflow https://stackoverflow.com/questions/3659839

Вопрос

Я использую совокупный инициализатор для настройки блока статических данных для теста устройства.

Я хотел бы использовать размер массива в качестве ожидаемого количества элементов, но это может потерпеть неудачу, если предоставляются слишком многочисленные инициализаторы:

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 очков, это убегает конец массива конец предоставленных значений и в инициализированные значения по умолчанию.

Могу ли я как-то обеспечить количество агрегатных инициализаторов массива при компиляции времени?

Это было полезно?

Решение

Во-первых: для этого может быть предупреждение. Вы пытались компилировать на самом высоком уровне предупреждения?

Тогда: если вы поменяете, какое значение рассчитывается и которое является литералом, вы можете поднять ошибку времени компиляции:

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

Другие советы

На самом деле он не сбежит с конца массива, потому что компилятор будет по умолчанию - инициализирует все элементы массива, который вы не инициализируете себя.

Если вы пытаетесь убедиться, что у вас есть определенное количество настроенных инициализаторов, я не уверен, как это сделать.

Если вы просто хотите убедиться, что массив - это количество предметов, которые у вас есть:

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

Сделаю трюк. Тогда просто используйте sizeof(expected) / sizeof(expected[0]) Чтобы получить общее количество элементов массива.

Только ради не повышения ответа ...

Вы можете добавить требование инициализации, изменяя 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 все еще совокупный, но это не стручок.

ISO / IEC 14882 (первое издание 1998-09-01) в с. 8.5.1.7 утверждают следующее:

Если в списке есть меньше инициализаторов, чем участники в совокупности, то каждый элемент, а не явный инициализированный, должен быть инициализирован по умолчанию (8.5). [Пример: struct s {int a; Char * B; int c; }; S ss = {1, "ASDF"}; Инициализирует SS.A с 1, SS.B с «ASDF» и SSCSC со значением выражения формы INT (), то есть 0.

Проще говоря, ответ на ваш вопрос нет.

Согласно MSDN, Если указаны меньшее количество инициализаторов, остальные элементы инициализируются 0, поэтому код должен работать, тем не менее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top