2010-10-04 5 views

Respuesta

13

En C99, debe usar stdbool.h, que define bool, true y false.

De lo contrario, lo que tienes está bien. Usar solo la enumeración puede ser un poco más simple, pero si realmente quiere ahorrar espacio, lo que tiene funciona.

+2

Probablemente su plataforma tiene 'sizeof (any_enum_t) == sizeof (int)'. – Potatoswatter

+0

@Potato: Ah, claro. Simplemente no creo que realmente valga la pena. En realidad, no es una pérdida, entonces sí. (Si no me equivoco, esa enumeración particular debe tener el tipo subyacente 'int', por cierto.) – GManNickG

+0

Mi C está oxidado, pero creo que el requisito' int' es un C++ 03-ismo. Dado que el ABI x86-64 también dice lo mismo, no es probable que haya mucha diferencia. – Potatoswatter

1

Creo que está bien, bonito y limpio.

3

La desventaja de typedef char bool; es que si compila con una implementación C99 y pasa a incluir <stdbool.h>, esto termina como typedef char _Bool;, lo cual es incorrecto. Además, si alguna vez intentó compilar el código como C++, tendría problemas (eso no es necesariamente un problema, pero podría ser).

Probablemente sería mejor utilizar <stdbool.h> si su implementación proporciona uno o utilizar un nombre diferente para el tipo, como BOOL.

5

La respuesta corta es: está bien. Es particularmente bueno si necesitas hacer grandes arreglos de ellos, aunque me sentiría tentado de usar el C99 incorporado .

Ya que ha preguntado "¿Hay cualquier inconveniente ..." Supongo que podría comentar que ha habido máquinas importantes que en realidad no tienen una instrucción de carga de caracteres. (El Cray y el DEC Alpha inicial vienen a la mente.) Las máquinas en el futuro de repente pueden volverse mínimas una vez más.

Será siempre ser rápido para cargar un tipo integral estándar.

Será probablemente siempre sea rápido para cargar un solo carácter.


1. Ver C99 6.2.5. Hay un tipo incorporado _Bool. Luego, si incluye <stdbool.h> (vea C99 7.16) obtendrá un alias, el más elegantemente llamado bool, y lo define para true y false. Si usas esto, chocará con tu typedef, pero estoy seguro de que sería algo fácil de solucionar.

0

Sugeriría usar un bit para representar verdadero o falso, en lugar de un personaje. Un personaje usa 8 bits. Podemos establecer 1 para verdadero y 0 para falso con solo 1 bit. Eso será más eficiente con la memoria y también satisface el propósito. (por ejemplo, indicador de char) 1;

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

+1

La memoria eficiente no significa necesariamente mejor. Es probable que el acceso a bits sea bastante lento e innecesariamente complejo. – GManNickG

+0

Usar el tipo de datos Bool es mejor, estoy de acuerdo. También es 1 bit. Pero, ¿puedes explicar por qué es lento? ¡Soy un novato! – sethu

+0

@GMan: si necesita una gran cantidad de valores booleanos indexados por posiciones enteras, una matriz de bits es definitivamente el camino a seguir. Si solo tiene un valor, usar 'int' o C99' bool' está perfectamente bien. No veo ninguna razón para usar 'char'. –

Cuestiones relacionadas