2009-05-06 21 views
19

¿Cuándo deberían usarse BOOL y bool en C++ y por qué?¿Cuándo deberían usarse BOOL y bool en C++?

Creo que el uso de bool es más limpio y portátil porque es de tipo incorporado. Pero BOOL es inevitable cuando interactúas con el código heredado/código C, o haciendo operaciones inter-op desde .NET con código C/API de Windows.

Así que mi política es: Use bool dentro de C++. Use BOOL cuando hable con el mundo exterior, p. Ej., Exporte la función en Windows DLL.

¿Existe una explicación definitiva sobre cuándo usar una sobre la otra?

+2

A los detractores: ¿por qué? Deje un comentario si vota la pregunta abajo –

+0

@James: Presumiblemente porque la pregunta fue estructurada para ser subjetiva, y en un sentido subjetivo esta no es una muy buena pregunta. Intenté reformularlo para que tenga un poco más de valor, pero lo dudo. – Pesto

+1

¿por qué los votos a la baja? Este es bueno. –

Respuesta

6

Matthew Wilson discute BOOL, bool, y similar en la sección 13.4.2 de Imperfect C++. Mezclar los dos puede ser problemático, ya que generalmente tienen diferentes tamaños (por lo que los punteros y las referencias no son intercambiables), y desde bool no se garantiza que tenga un tamaño particular. Tratar de utilizar typedefs o compilating condicional para suavizar las diferencias entre BOOL y bool o tratando de permitir un solo tipo booleano para trabajar en C y C++ es aún peor:

#if defined(__cplusplus) || \ 
    defined(bool) /* for C compilation with C99 bool (macro) */ 
typedef bool bool_t; 
#else 
typedef BOOL bool_t; 
#endif /* __cplusplus */ 

significa Este enfoque que el retorno de una función el tipo puede variar según el idioma que lo llame; Wilson explica que ha visto más de un error en su propio código y otros que resulta de esto. Él concluye:

La solución a esta imperfección es, como suele ser, la abstinencia. Nunca utilizo bool para cualquier cosa que se pueda acceder a través de múltiples unidades de enlace-bibliotecas dinámicas/estáticas, archivos de objetos suministrados-lo que básicamente significa no en funciones o clases que aparecen fuera de los archivos de encabezado. La respuesta práctica, tal como es, es usar un tipo pseudo-booleano, que es del tamaño de int.

En resumen, estaría de acuerdo con su enfoque.

+2

No entiendo completamente por qué un número entero de 32 bits tendría problemas con la conversión a bool. Una conversión a bool es simple: cero convierte a falso, cualquier otra cosa se convierte en verdadero. Si Wilson estaba cortando un byte de un entero de 32 bits, que es la única forma en que veo que esto podría suceder, entonces la solución es escribir código sin trucos estúpidos, y dejar que el compilador maneje las conversiones. Del mismo modo, no hay peligro en la conversión de un BOOL de terceros a un C++ Bool, a menos que se determine que lo arruine. –

+0

Tiene razón, no pude seguir su ejemplo lo suficiente y omití información importante. (Wilson está de acuerdo en que fue un error estúpido, pero argumenta que el código debe ser tan estúpido como sea posible). Actualicé mi resumen para explicar mejor. –

4
+4

Por supuesto que hay una buena razón. El segundo artículo dice que Win32 usa BOOL para permanecer compatible con C. Tendrá que usar BOOL si está trabajando con el código heredado. –

+0

No veo por qué necesitaría usar BOOL, ya que C99 es compatible con bool, y todos los compiladores C89 que he usado lo soportan también. Además, la pregunta está etiquetada como C++, no como C. –

+2

Siempre voté por alto los enlaces de The Old New Thing ... soooo +1 – Aardvark

2

Otra situación en la que debe usar BOOL: al implementar una función de devolución de llamada que toma o devuelve BOOL.

Por ejemplo, EnumWindows() toma un puntero a una función de devolución de llamada con la siguiente firma:

BOOL CALLBACK EnumWindowsProc(  
    HWND hwnd, 
    LPARAM lParam 
); 

Si utiliza bool para esto, tendrá que encasillado el puntero de su función.

9

Si BOOL es un tipo de tipo integral, y siempre lo es, y BOOL se define para que funcione correctamente, las conversiones estándar lo harán correctamente. No puede usarlos indistintamente, pero puede acercarse.

Use BOOL en la interfaz, donde tiene que hablar con la API Win32 o lo que sea. Use bool en todos lados.

-2

Pienso en "verdadero"/"VERDADERO" y "falso"/"FALSO" como azúcar sintáctico, una solución a un problema que nunca existió.Siempre pensé que era más fácil usar y leer "1" y "0".

Cuando piense que las banderas en los registros están encendidas o apagadas, ¿cree que en 1s y 0s o trues y falsees? ¿Qué sucede si quiere almacenar varias banderas en una sola variable? 1s y 0s son universales.

Creo que la palabra "falso" es demasiado larga para su propio bien. Cuando veo un "0", se destaca en mi mente como una señal de stop roja. Las señales de alto son rojas porque el color rojo atrae la atención de las personas. Leer la palabra "falso" es como ver una señal de stop verde.

Así que, al diablo con bool y BOOL. De manera predeterminada a int.

... pero, en realidad, obtener las banderas booleanas correctas es la menor preocupación en un idioma con tantas formas de cometer un error como C++.

+2

Eso es como decir que un cuchillo de combate es peligroso porque puede sacarle el ojo. Hijo, debes mantener tu cuchillo afilado y manejarlo con respeto. Porque, sí, le quitará el ojo si lo está agitando. – knight666

+6

¿Un problema que nunca existió? De Verdad? Si ve una función que tiene un tipo de retorno 'bool' le dice que puede devolver verdadero o falso. Si ve uno que tiene el tipo de retorno 'int', ¿qué le dice eso? – jalf

+0

Creo que la palabra "falso" es demasiado larga para su propio bien. Hagamos la compresión y el cifrado del código ... Los nombres de las variables son demasiado largos también, usemos el alfabeto;). – AlexTheo

1

Si desea utilizar una función escrita en C++ (por ejemplo, incrustada en la biblioteca DLL) en el programa administrado (por ejemplo, en C#), tiene para usar BOOL. Si devuelve bool, el resultado siempre será cierto: se trata de un error conocido desde hace mucho tiempo y aparentemente aún no se ha resuelto (VS 2010, .NET Framework 4).

Recuerdos - Spook.

+0

¡Claro! He sufrido este error y me tomó mucho tiempo darme cuenta de que es un error de .NET. Aunque hay una solución (atributo) para ello. – zhaorufei