2010-10-04 2 views

risposta

13

In C99, si dovrebbe utilizzare stdbool.h, che definisce bool, true e false.

Altrimenti quello che hai va bene. Usare solo l'enumerazione può essere un po 'più semplice, ma se vuoi davvero risparmiare spazio ciò che hai funziona.

+2

Probabilmente la sua piattaforma ha 'sizeof (any_enum_t) == sizeof (int)'. – Potatoswatter

+0

@Potato: Ah, giusto. Non penso proprio che possa valerne la pena. Non è una vera perdita, quindi meh. (Se non sbaglio, quel particolare enum deve avere il sottostante tipo 'int', comunque.) – GManNickG

+0

My C è arrugginito, ma penso che il requisito' int' sia un C++ 03-ism. Poiché l'ABI x86-64 dice anche la stessa cosa, non è probabile che ci sia molta differenza. – Potatoswatter

1

Penso che sia bello, bello e pulito.

3

Lo svantaggio di typedef char bool; è che se si compila con un'implementazione C99 e capita di includere <stdbool.h>, questo finisce come typedef char _Bool;, che è sbagliato. Inoltre, se hai mai provato a compilare il codice come C++, avresti problemi (che non è necessariamente un problema, ma potrebbe essere).

Probabilmente sarebbe meglio utilizzare <stdbool.h> se l'implementazione ne prevede uno o utilizzare un nome diverso per il tipo, ad esempio BOOL.

5

La risposta breve è: va bene. È particolarmente utile se è necessario creare array di grandi dimensioni, anche se sarei tentato di utilizzare solo il C99 integrato .

Dato che hai chiesto "c'è qualsiasi lato negativo ..." Suppongo di poter notare che ci sono state macchine importanti che in realtà non hanno un'istruzione di caricamento del personaggio. (Mi vengono in mente i Cray e gli iniziali DEC Alpha.) Le macchine nel futuro potrebbero improvvisamente andare tutte al minimo ancora una volta.

Sarà sempre essere veloce per caricare un tipo integrale standard.

Sarà probabilmente essere sempre veloce per caricare un singolo carattere.


1. Vedere C99 6.2.5. C'è un tipo integrato _Bool. Quindi, se si include <stdbool.h> (vedere C99 7.16) si ottiene un alias, più elegantemente denominato bool e definito per true e false. Se lo usi, si scontrerà con il tuo typedef, ma sono sicuro che sarebbe una cosa facile da risolvere.

0

Suggerirei di usare un bit per rappresentare true o false, piuttosto che un carattere. Un personaggio usa 8 bit, Possiamo impostare 1 per vero e 0 per falso con solo 1 bit. Ciò sarà più efficiente in termini di memoria e soddisferà anche lo scopo. (es. char flag: 1;

Riferimento: http://en.wikipedia.org/wiki/Bit_field

+1

L'efficienza della memoria non significa necessariamente migliore. È probabile che l'accesso ai bit sia piuttosto lento e inutilmente complesso. – GManNickG

+0

Usare il tipo di dati Bool è meglio, sono d'accordo. È anche 1 bit. Ma puoi spiegare perché è lento. Sono un principiante !! – sethu

+0

@GMan: se avete bisogno di un gran numero di valori booleani indicizzati da posizioni intere, un array di bit è sicuramente la strada da percorrere. Se è solo un singolo valore, usare 'int' o C99' bool' è perfettamente a posto. Non vedo alcun motivo per usare 'char'. –