2011-02-04 9 views

risposta

131

È stata definita l'implementazione e lo standard attribuisce notevole importanza a tale chiarezza.

§5.3.3/1, abbreviata:

sizeof(char), sizeof(signed char) e sizeof(unsigned char) sono 1; il risultato di sizeof applicato a qualsiasi altro tipo fondamentale è definito dall'implementazione. [Nota: in particolare, sizeof(bool) e sizeof(wchar_t) sono definiti dall'implementazione. 69)]

nota 69):

sizeof(bool) non è richiesto di essere 1.

+44

+1 per enfatizzare l'enfasi! –

+19

+1 per la nota a piè di pagina che sottolinea l'enfasi ;-) – Nawaz

+0

c'è una bandiera con cui ho bisogno di compilare il mio programma, che il mio compilatore userà solo 1 byte per 'bool'? – Eagle

10

È stata definita l'implementazione. Solo lo sizeof(char) corrisponde allo standard 1.

+1

nota che 1 nello standard può significare 4 byte. Di ogni tipo è un prodotto di 4. Quindi attenzione che lo standard SOLO definisce char è 1, ma non definisce la misurazione – user3063349

+0

1 significa 8 bit o 1 byte nello standard – paulm

+6

1 byte. Il numero di bit per byte non è definito dallo standard (deve essere a almeno 8 IIRC), ma può essere trovato in 'CHAR_BIT', definito in' climits'. – peoro

3

Vedere 5.3.3 comma 1:

[Nota : in particolare, sizeof (bool) e sizeof (wchar_t) sono implementazione-defined.69)]

13

http://msdn.microsoft.com/en-us/library/tf4dy80a.aspx

"In Visual C++ 4.2, lo Standard C++ file header conteneva un typedef che equiparato bool con int. In Visual C++ 5.0 e versioni successive, bool viene implementato come un tipo predefinito con una dimensione di 1 byte. Ciò significa che per Visual C++ 4.2, una chiamata di sizeof (bool) restituisce 4, mentre in Visual C++ 5.0 e versioni successive, la stessa resa restituisce 1. Ciò può causare problemi di danneggiamento della memoria se sono stati definiti membri della struttura di tipo bool in Visual C++ 4.2 e stanno mescolando i file oggetto (OBJ) e/o DLL compilati con i compilatori 4.2 e 5.0 o successivi. "

+1

Ti rendi conto che questo è in qualche modo correlato alla domanda, ma chiaramente non è una risposta, dal momento che 0xbadf00d ha chiesto dello standard, non di un'implementazione del compilatore specifica/arbitrariamente selezionata, giusto? –

+10

@ChristopherCreutzig È una prova del controesempio. – kinokijuf

+7

@kinokijuf Non è un controesempio. Esistono molte cose in Visual C++ che non sono conformi allo standard. – 0xbadf00d