¿Por qué las palabras clave feas en C11?

15

Actualmente estoy leyendo un borrador de la especificación C11. Las nuevas palabras clave introducidas: _Bool, _Alignof, _Atomictodas 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_tarrastrá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?

Vorac
fuente
2
No, no me preocuparía por tipos realmente largos como ese. El número de combinaciones de letras y números de _, az, AZ y 0-9 significa que probablemente serían cortas y difíciles de recordar.
Neil
2
Un sinónimo de mejor aspecto para cada palabra clave a menudo se define en el archivo de encabezado de biblioteca estándar relevante. Por ejemplo, cualquier <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.
andrew.punnett

Respuestas:

20

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.

9000
fuente
Cabe señalar que la pregunta era con respecto a C no C ++, no que importa. Su respuesta cubre la razón por la que un nuevo tipo supoprted se denominaría algo para evitar el uso que causa un conflicto con un tipo personalizado Boolen 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.
Ramhound
1
@Ramhound, en mi humilde opinión, boolestarí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.
Vorac
66
@Vorac: El problema es que si boolse agrega incondicionalmente al lenguaje, todos los proyectos que tengan su propia versión (perfectamente legítima) booldejarí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 de boolsí mismo, esto se ha agregado como typedef _Bool boolen <stdbool.h>.
Bart van Ingen Schenau
1
@BartvanIngenSchenau: que permite a las personas reemplazar su propio typedef de un valor booleano por uno contenido stdbool.ho actualizar su propio typedef al nuevo tipo para admitir su código heredado.
Ramhound
1
@Ramhound: las personas con variables que entran en conflicto con las nuevas palabras clave C11 también podrían "¿Entonces no lo usan?". Hay un indicador de compilación std = xxx para evitar conflictos con los nuevos estándares de idioma.
Scooter
8

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:

También se reservan para el implementador todos los identificadores externos que comienzan con un guión bajo, y todos los demás identificadores que comienzan con un guión bajo seguido de una letra mayúscula o un guión bajo.

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.

Dotti
fuente
44
Debe citar y posiblemente vincular o nombrar la sección de estándares apropiada, para que otros puedan verificar su declaración rápidamente. Esto mejorará tu respuesta.
SpaceTrucker