Frage

Ich verwende eine Aggregatinitialisierung einen Block von statischen Daten für einen Komponententest einzurichten.

Ich möchte die Array-Größe als die erwartete Anzahl der Elemente verwenden, dies kann jedoch fehlschlagen, wenn zu wenige initializers vorgesehen sind:

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

Dies gibt keine Compiler-Fehler in Visual Studio 2008.

Ich möchte in der Lage sein, es als solches zu verwenden:

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

, sondern weil ich habe keine Kompilierung-Garantie von 14 Punkten, diese Läufe aus dem Ende des Arrays Ende der vorgesehenen Werte und in die default-initialisiert Werte.

Kann ich irgendwie erzwingen die Zahl der aggregierten Array initializers zur Compile-Zeit?

War es hilfreich?

Lösung

Erstens: Es könnte eine Warnung dafür sein. Haben Sie bei der höchsten Warnstufe Kompilieren versucht?

Dann: Wenn Sie tauschen den Wert berechnet wird, und das wörtliche ist, können Sie einen Fehler bei der Kompilierung erhöhen:

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

Andere Tipps

Eigentlich wird es nicht über das Ende des Arrays ausgeführt werden, da der Compiler alle Elemente des Arrays standardmäßig initialisiert wird, dass Sie sich nicht initialisiert wurde.

Wenn Sie versuchen, um sicherzustellen, dass Sie eine bestimmte Anzahl der konfigurierten initializers haben, ich bin nicht sicher, wie das zu tun.

Wenn Sie nur sicher, dass das Array machen wollen, ist die Anzahl der Elemente, die Sie haben:

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

Wird es tun. Dann einfach sizeof(expected) / sizeof(expected[0]) verwenden, um die Gesamtzahl der Array-Elemente zu erhalten.

Nur aus Gründen einer nicht-Boost-Antwort ...

Sie können eine Initialisierung Anforderung hinzufügen, indem Sie my_struct_type ändern.

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 ist noch ein Aggregat, aber es ist nicht POD.

ISO / IEC 14882 (Erste Ausgabe 1998-09-01) in p. 8.5.1.7 heißt es wie folgt:

  

Wenn es weniger Initialisierer in der sind   Liste als es Mitglieder in der   Aggregat, dann wird jedes Mitglied nicht   ausdrücklich wird initialisiert   default-initialisiert (8.5). [Beispiel:   struct S {int a; char * b; int c; }; S   ss = {1, "asdf"}; initialisiert ss.a   mit 1, ss.b mit "asdf" und ss.c   mit dem Wert eines Ausdrucks der   Form int (), das heißt, 0]

Einfach gesagt, die Antwort auf Ihre Frage ist nicht.

Nach dem Msdn , wenn weniger Initialisierer angegeben sind, werden die übrigen Elemente mit 0 initialisiert, so dass der Code sollte trotzdem funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top