2009-03-29 13 views
11

Questa domanda è relativa al sistema operativo Symbian, ma penso che anche il veterano di C/C++ possa aiutarmi. Sto compilando una libreria open source su Symbian OS. Usando un compilatore GCCE, esso compila senza errori (dopo alcuni aggiustamenti :)). ho cambiato compilatore per ARMv5 e ora ho più errori con le definizioni di struct const statici, ad esempio: ho una struct:che definisce le strutture const statiche

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

E la seguente definizione di una struttura const di tipo Foos

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

GCCE non ha alcun problema con questo e ARMV5 diventa "previsto un errore di espressione" su ".a = 1, .b = 2,". Da quello che ho cercato su google, penso che questo metodo dovrebbe essere legale in C ma illegale in C++, se questo è il caso, allora quali sono le possibilità per dichiarare le strutture const in C++? Se questo non è il caso, sarà apprezzato qualsiasi altro aiuto.

Grazie in anticipo :)

risposta

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

compila sia con g ++ e gcc.

Si potrebbe naturalmente, come onebyone sottolinea, definire un costruttore:

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

Che si inizializzare in questo modo:

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

Grazie! Rimozione dei nomi dei campi ha funzionato. – dudico

4

La notazione stile è penso valido in ANSI C99. Non è valido ANSI C89. Quasi tutti i compilatori C non hanno implementato C99.

+1

gcc supporta la notazione in stile punto senza alcuna opzione da riga di comando. Ci sono altri compilatori C? : O –

+0

Purtroppo, sì. MSVC, che ha AFAIK bloccato il supporto C. –

5

Questo è legale C99, ma non legale C89 o C++. Presumibilmente lo stai compilando come C++, quindi se usi le opzioni del compilatore per far rispettare la conformità agli standard, GCCE lo rifiuterà anche.

È possibile eseguire foo = {1, 2}; in C o C++. Ovviamente perdi il vantaggio che i nomi dei campi siano proprio lì: devi fare affidamento su come ottenere l'ordine giusto.

Un'altra buona opzione in C++ è definire un costruttore per la propria struct e inizializzare con static const Foos foo(1,2);. Ciò impedisce la struttura del POD, tuttavia, quindi non è possibile fare le stesse ipotesi sulla sua rappresentazione in memoria.

5

Solo una nota che writable static data non è supportata nelle DLL su alcune versioni di Symbian. Potrebbe non influenzare ciò che stai facendo in quanto i tuoi esempi sono const o potresti supportare solo Symbian v8.1b o successivo.

Ho pensato di indicarlo mentre cadevo in quella trappola una volta.

Citazione dal link qui sopra:

Supporto per il mondiale scrivibili statici dati su Symbian OS

Symbian OS supporta scrivibile globale dati statici in EXE su tutte le versioni e portatili.

Versioni del sistema operativo Symbian basato sul kernel EKA2 (8.1b e successivi) supportano WSD in DLL sull'hardware di destinazione. Le versioni 8.1ae precedenti, basate sul kernel EKA1 , non supportano il file WSD globale nelle DLL.

+0

Sì, sono a conoscenza del limite dei dati statici nel sistema operativo pre 8.1, sto utilizzando la libreria per 9.1 e versioni successive. Grazie per aver fatto comunque quella nota importante! – dudico

Problemi correlati