c++ clang language-lawyer

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.