2013-05-05 5 views
5

Ho una struttura con un campo unsigned char[16] che vorrei inizializzare su zeri. Il seguente codice (fortemente semplificato) compila bene con clangore (OS X):Come inizializzare un array di caratteri non firmato da una stringa letterale?

struct GUID { 
    unsigned char bytes[16]; 
    GUID() : bytes("\0\0\0\0""\0\0\0\0""\0\0\0\0""\0\0\0") {}; 
} 

Nota io uso 15 \0 s perché il 16 è il terminatore zero della stringa letterale, e clang lamenta se si inizializza una stringa con troppi byte.

Ora, quando provo a compilare con GCC 4.5.3 (cygwin), ottengo:

error: incompatible types in assignment of 'const char [16]' to 'unsigned char [16]' 

Perché non funziona, e come posso farlo funzionare? (Potrei ovviamente passare attraverso l'array nel costruttore, ma mi piacerebbe usare l'elenco di inizializzazione, se possibile, e mi piacerebbe capire perché funziona in un compilatore, ma non l'altro.)

risposta

1

In il costruttore GUID è possibile utilizzare il memset (byte, 0, sizeof (byte));

+0

Giusto, questa è probabilmente la soluzione più pulita e ciò che farò. – jdm

+0

No, per il tuo caso particolare, la soluzione migliore è quella di DeadMG. –

+0

@Haroogan: La matrice è garantita per essere riempita di zeri se faccio byte()? – jdm

2

Un semplice bytes() dovrebbe essere sufficiente in questo caso. Potresti anche considerare bytes { 0,0,0,0.... }.

Inoltre, utilizzare std::array, non T[]. Solo gli sciocchi usano T[] quando possono usare std::array.

2

Dal momento che abbiamo a che fare con la sua POD sufficienti per costruire in modo esplicito byte, che si tradurrà nella memoria corrispondente essere 'azzerato':

struct GUID 
{ 
    unsigned char bytes[16]; 
    GUID() : bytes(){} 
}; 

E 'probabilmente la pena notare che se non si costruisce in modo esplicito byte nell'elenco di inizializzazione, si sarebbe lasciato inizializzata

struct GUID 
{ 
    unsigned char bytes[16]; 
    GUID(){}; 
}; 

Se la variabile membro non un POD ma invece fosse un oggetto membro allora invece di essere lasciato inizializzata rimetterebbe suo costruttore di default.

Problemi correlati