Переглядаючи граматику BNF C, я подумав, що дивно, що виробниче правило для декларації виглядає таким чином (згідно https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ):
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
Навіщо використовувати *
кількісний коефіцієнт (що означає нуль або більше подій) для init-declarator
? Це дозволяє твердженням, таким як int;
або void;
бути синтаксично дійсними, навіть якщо вони семантично недійсні. Чи не могли вони просто використати +
кількісний коефіцієнт (одне або кілька подій) замість *
правила виробництва?
Я спробував скласти просту програму, щоб побачити, що видає компілятор, і все, що він робить, - це попередження.
Вхід:
int main(void) {
int;
}
Вихід:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
int
як тип повернення для, main
а не використовуйте ()
як список типів параметрів у функціях, а (void)
замість цього.