С грамматика составное утверждение
Я смотрел на грамматику C на K&R и нашел это:
compound-statement:
{ declaration-list opt statement-list opt }
declaration-list:
declaration
declaration-list declaration
statement-list:
statement
statement-list statement
Это означает, что у нас не может быть объявлений после заявлений. Однако я делаю это очень часто, как:
#include <stdio.h>
int main()
{
printf("Lets use a new block");
{
int a=1;
printf("%d",a);
int b=3;
printf("%d",b);
}
return 0;
}
Этот код компилируется без предупреждения и без ошибок. Я не правильно понимаю грамматику?
2 ответа
Чтобы получить нужную ошибку, передайте эти флаги в gcc:
-std=c90 -pedantic-errors
Расширения GNU, а также более поздние стандарты C допускают объявления после других операторов в области видимости.
Вы хорошо понимаете грамматику. Однако C продвинулся со времен K&R, и теперь грамматика принимает чередующиеся объявления и утверждения.