2011-04-14 22 views
17

En muchos programas, veo declaraciones con los identificadores FALSE y false. ¿Hay alguna diferencia entre ellos en el contexto de C++?¿Cuál es la diferencia entre falso y FALSO?

También en algunos programas, vi bool y en algún lugar BOOL. ¿Cuál es la diferencia entre ambos?

¿Alguien me puede explicar la diferencia entre estos identificadores? Gracias.

+0

¿Es esto en Windows? Entonces es un remanente de un tiempo C cuando no tenía booleanos reales y FALSO se definió a 0. – RedX

+0

@RedX: quiere decir FALSO está definido por booleanos, entonces ¿qué pasa con falso? – RidaSana

+0

No, 'FALSE' se definió así:' #define FALSE (0) ' –

Respuesta

22

Si usted ha incluido windows.h, a continuación, se FALSE #defined como 0. TRUE se #defined como 1. Es no un tipo booleano, que es un tipo entero. Windows también definió el tipo BOOL, que en realidad es un tipo entero diseñado para acomodar los valores TRUE y FALSE.

Las secciones pertinentes del Código de windows.h ser algo como esto:

#ifdef FALSE 
#undef FALSE 
#endif 
#define FALSE 0 

#ifdef TRUE 
#undef TRUE 
#endif 
#define TRUE 1 

typedef int BOOL, *PBOOL, *LPBOOL; 

de Windows fue originalmente escrito en C, al igual que todas las aplicaciones de Windows originales. En ese momento, C no tenía un tipo booleano definido por el estándar. En cambio, los desarrolladores se vieron obligados a definir sus propias constantes booleanas. Para evitar el posible lío que podría causar, Microsoft decidió un estándar que se usaría para todas las aplicaciones de Windows.

Si está escribiendo aplicaciones de Windows, es posible que necesite utilizar los identificadores TRUE y FALSE. Varias de las funciones definidas en windows.h aceptan parámetros booleanos (en realidad, ¡enteros!) Escritos como BOOL o devuelven valores de ese tipo. C++, que está fuertemente tipado, puede quejarse si los coacciona al tipo booleano definido en el estándar del idioma. Para mayor coherencia, utilizo los identificadores anteriores en todas mis llamadas a las funciones de la API de Windows, y las true y false palabras clave ahora definidas por el estándar en todos los métodos que escribo yo mismo.

Realmente no hay ninguna razón para no usar FALSE como se define en windows.h. Pero no debe definirlo usted mismo en un archivo de encabezado propietario, como han mencionado otros, porque no hay garantía de que la definición se mantenga constante a lo largo del tiempo. Eso podría causar algunos errores bastante tontos, del tipo que califica para aparecer en el Daily WTF.

Mat's answer es 100% correcto que ni TRUE ni están definidos por los estándares C o C++. Sin embargo, son estrictamente definidos por la API de Windows y se garantiza que no se modificarán. Su uso no producirá código C++ estrictamente multiplataforma que cumpla estrictamente con los estándares, pero eso rara vez es una preocupación cuando se escriben aplicaciones de Windows, ya que tampoco llamará a ninguna de las otras funciones en windows.h.

+0

@cody: sí, estoy usando la aplicación de ventana ... entonces estoy usando FALSE y TRUE ... está trabajando con bool type ... – RidaSana

+0

@Cody : ¿qué hay de la segunda parte de la pregunta sobre bool y BOOL? – RidaSana

+1

@Miss: lo agregué en una actualización de mi respuesta. Sucintamente, 'bool' es el tipo booleano definido en el estándar C++. Funciona con las palabras clave también en minúsculas 'true' y' false'. 'BOOL' es un tipo entero, definido por' windows.h', diseñado para trabajar con 'TRUE' y 'FALSE' también en mayúsculas. Fácil de recordar, ya que los casos coinciden con cada grupo. –

13

FALSE no está definido en la norma. Solo false es. true y false se llaman "boletines booleanos" (y son palabras clave en C++).

FALSE a veces se define como una macro. No puede confiar en que esté presente en un entorno que cumpla con los estándares, ya que no forma parte del estándar.

En otras palabras, el siguiente programa es válido C++:

#include <iostream> 

#define FALSE 1 

int main() 
{ 
    bool a = false; 
    bool b = FALSE; 
    std::cout << a << " " << b << std::endl; 
    return 0; 
} 

y se imprimirá 0 1 como se esperaba. FALSE no es un símbolo privilegiado de ninguna manera.

+0

pero FALSO y falso return 0 .. eso significa que ambos tipos son bool .. right – RidaSana

+2

no en C++ estándar. 'TRUE' y' FALSE' se pueden definir (generalmente como una macro, a veces como un valor 'enum'), pero no se puede confiar en ello. Con 'GCC' en Linux, por ejemplo,' bool something = FALSE; 'es un error en tiempo de compilación porque' FALSE' no está definido. Cuando se define 'FALSE', generalmente se definirá como' 0' o 'false', pero eso no es algo en lo que deba confiar. Confíe en los estándares. – Mat

+0

¿qué hay de la segunda parte de la pregunta sobre bool y BOOL? – RidaSana

1

false es una palabra clave en C++.

FALSE no está definido por el estándar C++. Pero la mayoría de los compiladores tienen FALSO define como un macro preprocesador con el valor 0.

+0

quiere decir que ya está predefinido como macro ... – RidaSana

+0

@Miss: 'Predefinido'? En la mayoría de los casos, deberá incluir #include algún archivo de encabezado para obtener #define. – harper

2

en C++, falsa está incorporado un literal de tipo booleano que representa el valor falso (el otro valor posible está representado con el literal verdadera)

FALSO es un #define cuya definición depende de mayo en la plataforma, pero en general es 0.

+0

que significa falso y FALSO son ambos tipo booleano ... FALSO significa 0 pero falso también debería ser 0 porque es un tipo booleano ..is't – RidaSana

+1

false no se evalúa a 0, sino que se fuerza a 0 (o se convierte si lo prefiere, como cuando un int se convierte implícitamente en un flotante). FALSE es reescrito a 0 por el preprocesador. Tenga en cuenta que FALSO también se puede definir por falso, depende de la plataforma. –

+1

@Miss: no, 'FALSE 'podría ser de tipo booleano, pero generalmente es un tipo integral. Puede usarlo como un valor booleano, pero sigue siendo integral. Esto es muy importante cuando se trata de deducción de plantilla y resolución de función sobrecargada, por ejemplo. 'f (falso)' y 'f (FALSE)' pueden llamar a dos funciones completamente diferentes si 'FALSE' se expande a' 0'. –

0

no utilice FALSE. Como han dicho otros, es una macro evaluación de 0. He escuchado historias de personas dejando una empresa y poniendo (a propósito) un #define FALSE 1 en lugares aleatorios en la base de código. Una manera segura de causar estragos.

Pegue con false ya que es parte del estándar C++.

+0

Parece fácil de arreglar si su definición original incluye '#ifdef FALSE #undef FALSE' –

1

Recuerda qué significan los verdaderos y falsos booleanos. Siempre van a ser enteros (0,1). Un compilador puede no reconocerlo, pero siempre se almacenarán y ejecutarán a través de la CPU como enteros. Un depurador mostrará esto. Si está en mayúsculas o no, realmente no importa porque no debería haber diferencias en su implementación o uso. Si su compilador tiene algunas macros escritas para admitir mayúsculas y minúsculas verdaderas y falsas, entonces es genial, pero es solo para satisfacer sus necesidades. Como todos los otros tipos.

0

Nota importante sobre API de Windows: algunas funciones de biblioteca de WIndows devuelven valores enteros arbitrarios aunque el tipo de devolución se define como BOOL. Lo mejor es nunca comparar un BOOL a TRUE. use

bSomeVal != FALSE instead. 
Cuestiones relacionadas