Pregunta

Estoy utilizando un inicializador agregado a configurar un bloque de datos estáticos para una unidad de prueba.

Me gustaría usar el tamaño de la matriz como el número esperado de elementos, pero esto puede fallar si se proporcionan muy pocos inicializadores:

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

Esto da ningún error de compilación en Visual Studio 2008.

Me gustaría ser capaz de utilizarlo como tal:

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

sino porque no tengo una garantía de tiempo de compilación de 14 puntos, esto va de la final de la matriz finales de los valores previstos y en los valores por defecto-inicializado.

¿Puedo hacer cumplir alguna manera el número de inicializadores de matriz agregados en tiempo de compilación?

¿Fue útil?

Solución

Primero: No podría ser una advertencia para esto. ¿Ha tratado de compilar en el nivel más alto de advertencia?

A continuación: Si se cambia el valor que se calcula y que es literal, podría elevar un error en tiempo de compilación:

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

Otros consejos

En realidad no va a funcionar fuera de la final de la matriz, porque el compilador por defecto-inicializar todos los elementos de la matriz que no se ha inicializado a sí mismo.

Si usted está tratando de asegurarse de que usted tiene un número específico de inicializadores configurados, no estoy seguro de cómo hacerlo.

Si lo que desea es asegurarse de que la matriz es el número de elementos que tiene:

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

hará el truco. Entonces sólo tiene que utilizar sizeof(expected) / sizeof(expected[0]) para obtener el número total de elementos de la matriz.

Sólo por el bien de una respuesta no-Boost ...

Puede agregar un requisito de inicialización mediante la modificación 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 sigue siendo un agregado, pero no es POD.

ISO / IEC 14882 (Primera edición 1998-09-01) en p. 8.5.1.7 indica lo siguiente:

  

Si hay menos inicializadores en el   Lista de los que hay miembros en el   agregado, a continuación, cada uno no miembro   inicializado explícitamente será   default-inicializado (8.5). [Ejemplo:   struct S {int a; char * b; c int; }; S   ss = {1, "asdf"}; inicializa ss.a   con 1, ss.b con "asdf", y ss.c   con el valor de una expresión de la   forma int (), que es, 0.]

Simplemente, la respuesta a su pregunta no es.

De acuerdo con la MSDN , si menos inicializadores se especifican, los elementos restantes se inicializan con 0, así que el código debería funcionar, no obstante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top