¿Por qué la gramática BNF de C permite declaraciones con una secuencia vacía de init-declaradores?

rafaelfp:

Al mirar a través de la gramática BNF de C, pensé que era raro que la regla de producción de que se declare visto así (según https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ):

<declaration> ::=  {<declaration-specifier>}+ {<init-declarator>}* ;

¿Por qué utilizar un *cuantificador (que significa cero o más ocurrencias) para el init-declarator? Esto permite que las declaraciones tales como int;o void;ser sintácticamente válida, aunque son semánticamente válida. ¿No podían haber utilizado un +cuantificador (una o más ocurrencias) en lugar de *en la regla de producción?

He intentado compilar un programa sencillo para ver lo que las salidas del compilador y lo único que hace es emitir una advertencia.

Entrada:

void main() {
    int;
}

Salida:

test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
     int;
     ^~~
user2357112 apoya Mónica:

declaration-specifierincluye type-specifier, que incluye enum-specifier. Una construcción como

enum stuff {x, y};

es una válida declarationsin init-declarator.

Construcciones como int;son gobernados por restricciones más allá de la gramática :

Una declaración no sea una declaración static_assert declarará al menos un declarador (aparte de los parámetros de una función o los miembros de una estructura o unión), una etiqueta, o los miembros de una enumeración.

Me imagino que hay razones de compatibilidad hacia atrás detrás de su compilador sólo la emisión de una advertencia.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=405910&siteId=1
Recomendado
Clasificación