2009-03-29 14 views
11

Diese Frage bezieht sich auf Symbian OS, aber ich denke, dass C/C++ - Veteran kann mir auch helfen. Ich kompiliere eine Open-Source-Bibliothek für Symbian OS. Mit einem GCCE-Compiler kompiliert es ohne Fehler (nach etwas Basteln :)). änderte ich Compiler ARMv5 und jetzt habe ich mehrere Fehler mit den Definitionen von statischer const structs, zum Beispiel: Ich habe eine Struktur:defining static const structs

typedef struct Foos{ 
    int a; 
    int b; 
} Foos; 

und die folgende Definition eines const struct vom Typ Foos

static const Foos foo = { 
    .a = 1, 
    .b = 2, 
}; 

gcce hat kein Problem mit diesem ein und geht ARMv5 "erwartet einen Ausdruck" Fehler auf der ".a = 1, .B = 2". Nach dem, was ich diesbezüglich gegoogelt habe, denke ich, dass diese Methode in C legal sein sollte, aber in C++ illegal ist, wenn das der Fall ist, was sind dann die Möglichkeiten, const-Strukturen in C++ zu deklarieren? Wenn das nicht der Fall ist, wird jede andere Hilfe geschätzt.

Vielen Dank im Voraus :)

Antwort

13
static const struct Foos foo = { 1, 2 }; 

Compiliert sowohl mit g ++ und gcc.

Sie natürlich könnte, wie OneByOne weist darauf hin, definieren einen Konstruktor:

typedef struct Foos { 
    int a; 
    int b; 
    Foos(int a, int b) : a(a), b(b) {} 
}; 

, die Sie mögen so initialisieren würde:

static const struct Foos foo(1, 2); 
+0

Danke! Entfernen der Feldnamen funktionierte. – dudico

4

Der Punkt Stil Notation ist denke ich, gültig in ANSI C99. Es ist nicht gültig, ANSI C89. Fast alle C-Compiler haben C99 nicht implementiert.

+1

gcc unterstützt die Punktstil-Notation ohne Befehlszeilenoptionen. Gibt es andere C-Compiler? : O –

+0

Leider ja. MSVC, die AFAIK hat seine C-Unterstützung eingefroren. –

5

Das ist legal C99, aber nicht legal C89 oder C++. Vermutlich kompilieren Sie dies als C++. Wenn Sie also Compiler-Optionen verwenden, um die Einhaltung von Standards zu erzwingen, wird GCCE diese ebenfalls ablehnen.

Sie können foo = {1, 2}; in C oder C++ tun. Natürlich verlieren Sie den Vorteil, dass die Feldnamen genau da sind: Sie müssen sich darauf verlassen, dass die Bestellung richtig ist.

Eine weitere gute Option in C++ ist ein Konstruktor für Ihre Struktur zu definieren und initialisieren mit static const Foos foo(1,2);. Dies verhindert jedoch, dass die Struktur POD ist, daher können Sie nicht dieselben Annahmen über ihre Repräsentation im Speicher treffen.

5

Nur eine Anmerkung, dass writable static data nicht in DLLs auf einigen Versionen von Symbian unterstützt wird. Es beeinflusst möglicherweise nicht, was Sie tun, da Ihre Beispiele const sind oder Sie nur Symbian v8.1b oder höher unterstützen.

Ich dachte, ich würde es darauf hinweisen, wie ich einmal in diese Falle fiel.

Zitat aus dem obigen Link:

Unterstützung für globale beschreibbar statische Daten auf Symbian OS

Symbian OS unterstützt globale beschreibbar statische Daten in EXE-Dateien auf alle Versionen und Handys.

Versionen von Symbian OS basiert auf dem EKA2 Kern (8.1b und höher) Unterstützung WSD in DLLs auf Zielhardware. Versionen 8.1a und früher, basierend auf der EKA1-Kernel, unterstützen keine globale WSD in DLLs.

+0

Ja, ich bin mir bewusst, das Limit für statische Daten im Betriebssystem vor 8.1, ich benutze die Bibliothek für 9.1 und später. Danke, dass du diese wichtige Notiz trotzdem gemacht hast! – dudico