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;
^~~
declaration-specifier
incluye type-specifier
, que incluye enum-specifier
. Una construcción como
enum stuff {x, y};
es una válida declaration
sin 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.