Beim Durchsehen der BNF-Grammatik von C fand ich es seltsam, dass die Produktionsregel für eine Deklaration so aussah (laut https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%) 20C% 20in% 20Backus-Naur% 20form.htm ):
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
Warum einen *
Quantifizierer (dh null oder mehr Vorkommen) für die verwenden init-declarator
? Dadurch können Anweisungen wie int;
oder void;
syntaktisch gültig sein, obwohl sie semantisch ungültig sind. Könnten sie nicht einfach einen +
Quantifizierer (ein oder mehrere Vorkommen) anstelle *
der Produktionsregel verwendet haben?
Ich habe versucht, ein einfaches Programm zu kompilieren, um zu sehen, was der Compiler ausgibt, und alles, was er tut, ist eine Warnung auszugeben.
Eingang:
int main(void) {
int;
}
Ausgabe:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
int
als Rückgabetyp für main
und nicht ()
als Parametertypenliste in Funktionen verwenden, sondern (void)
stattdessen.