Actualmente estoy leyendo un borrador de la especificación C11. Las nuevas palabras clave introducidas: _Bool, _Alignof, _Atomic
todas parecen extensiones personalizadas, en lugar de palabras clave reservadas estándar como struct, union, int
.
Me doy cuenta de que el estándar básicamente consiste en extensiones estandarizadas ... ¡pero aún así, esto es horrible! ¡Quizás pronto terminemos __Long_Long_Reallylong_Integer_MSVC_2020_t
arrastrándonos en el estándar!
¿Es la compatibilidad con versiones anteriores de código no estándar la única razón del nuevo estilo de las palabras clave?
<stdbool.h>
archivo de encabezado de implementación C11 debe incluir una macro de preprocesador como#define bool _Bool
. Esta es una solución ordenada, ya que conserva la compatibilidad con versiones anteriores, pero permite que cualquier código nuevo, que incluye el nuevo archivo de encabezado, utilice la sintaxis más atractiva.Respuestas:
Me imagino que la compatibilidad con versiones anteriores de código perfectamente estándar es una razón más importante.
Si agrega una palabra clave que podría haber sido utilizada como un identificador legítimo en el código anterior, crea una tonelada de dolor, de posibles errores sutiles, especialmente en C, un lenguaje con reglas de análisis de alguna manera complicadas.
Si estos identificadores se usaron como una interfaz pública en algún lugar, agrega dolor a todos los usuarios de bibliotecas tan desafortunadas, que podrían no usar C en absoluto, pero llamar a la biblioteca desde Ruby o Python, etc.
Es por eso que las nuevas palabras clave se verán menos como palabras bonitas y más como hacks atornillados que las personas tienen menos posibilidades de usar para otro propósito.
fuente
Bool
en el código heredado que fue ampliamente aceptado como booleano, pero que nunca fue parte del estándar C, por lo que la suposición no es segura. hacer.bool
estaría más en el espíritu de C. Además, no estoy completamente convencido por esta respuesta, ya que las palabras feas también podrían haber sido utilizadas por código no estándar. Y cambiar el estilo de las palabras hace que las palabras estándar sean más difíciles de reconocer de un vistazo.bool
se agrega incondicionalmente al lenguaje, todos los proyectos que tengan su propia versión (perfectamente legítima)bool
dejarían de compilarse. Eso dañaría seriamente la aceptación de la revisión del lenguaje. Esta es la razón por la que todos los nuevos identificadores se están tomando del conjunto reservado (comenzando así con_[capital]
). Como también había una gran demanda debool
sí mismo, esto se ha agregado comotypedef _Bool bool
en<stdbool.h>
.stdbool.h
o actualizar su propio typedef al nuevo tipo para admitir su código heredado.Los nombres que comienzan con un guión bajo y una letra mayúscula (y cualquier cosa con un guión bajo doble) se reservaron para la implementación del compilador / biblioteca estándar en los estándares anteriores.
De los identificadores reservados de C89 y C99:
Entonces, en teoría, esas nuevas palabras clave no deberían estar en uso en ningún código escrito anteriormente y eso conduce a una mejor compatibilidad con versiones anteriores que cualquier nombre simple, lo que probablemente sea la única razón.
fuente