c++ - ¿Por qué el stdbool.h de clang contiene#define false false
language-lawyer (2)
Después de ser señalado allí por un error del compilador, noté que el archivo
stdbool.h
de clang incluye (entre otras cosas) las siguientes líneas:
#define bool bool
#define false false
#define true true
Están contenidos en un bloque
#ifdef
que impone
__cplusplus
indirectamente, de ahí la etiqueta c ++ aunque
stdbool.h
es un encabezado C.
¿Cuál es la necesidad de esos define? Me imagino que son necesarios por alguna razón relacionada con el preprocesador, pero me interesaría saber qué parte de la norma o qué razón técnica hace que sea tan clandestina incluir esas.
Se agregó para admitir el modo GNU en C ++ , como podemos ver en este parche [cfe-commits] r115028 :
Defina las macros _Bool, bool, true y false cuando estemos en un dialecto C ++ compatible con GNU. Corrige <rdar: // problem / 8477819>.
entonces
gcc
admite esto como una extensión y esta modificación se realizó para admitir esa extensión.
Aunque no puedo encontrar el informe original del problema mencionado en el parche.
Esto no es conforme, como podemos ver en el borrador del estándar C ++ 11, sección
18.10
Otro soporte de tiempo de ejecución
[support.runtime]
:
El encabezado <cstdbool> y el encabezado <stdbool.h> no definirán macros llamadas bool, true o false.
pero
gcc
no está destinado a cumplir estrictamente en modo GNU.
stdbool.h
es parte de C99 y, por lo tanto, no fue compatible con el estándar C ++ hasta C ++ 11, que en el
Anexo D
dice:
Para compatibilidad con la biblioteca estándar de C y C Unicode TR, la biblioteca estándar de C ++ proporciona los encabezados de 25 C, como se muestra en la Tabla 154
e incluye
<stdbool.h>
.
stdbool.h
es un encabezado C, no un encabezado C ++.
Por lo general, no se encuentra en programas de C ++ porque
true
y
false
ya son palabras clave en C ++.
En consecuencia, si un programa C ++ incluye
stdbool.h
, es una indicación bastante clara de que es un programa C portado (por ejemplo, un programa C que se está compilando como C ++).
En este caso, G ++ admite
stdbool.h
en modo C ++ como una extensión GNU, según los comentarios de
stdbool.h
GCC
:
/* Supporting <stdbool.h> in C++ is a GCC extension. */
#define _Bool bool
#define bool bool
#define false false
#define true true
...
/* Signal that all the definitions are present. */
#define __bool_true_false_are_defined 1
Clang, del mismo modo, admite
stdbool.h
en C ++ para compatibilidad con G ++.
Los valores se definen aquí intencionalmente para que coincidan con el tipo C ++ incorporado en lugar de las definiciones C99 tradicionales.
Se definen como macros presumiblemente para proporcionar cierta compatibilidad con el
estándar C99
, que requiere:
El encabezado definirá las siguientes macros :
bool
,true
,false
,__bool_true_false_are_defined
.Una aplicación puede definir y luego redefinir las macros bool, true y false.