Что понимает C, когда за заголовком функции не следует составной оператор? - PullRequest
0 голосов
/ 21 декабря 2018

Я хотел бы понять природу ошибок "ожидаемые спецификаторы объявления перед" для "и" ... перед "i" "

Что на самом деле понимает компилятор из этого

#include <stdio.h>

int main(void)
int i, j, m[5][5];
for (i = 0; i < 25; i++)
    *(*m + i) = i;
i = 0, j = 0;

Неважно, что делает код (или сделал бы, если бы я включил его в фигурные скобки).Я хотел бы знать, что ожидает C после заголовка функции, если за ним не следует составной оператор или точка с запятой (для обозначения прототипа).

Заранее спасибо

1 Ответ

0 голосов
/ 21 декабря 2018

Парсеры сначала проверяют синтаксис.Синтаксис определения функции: ( 6.9.1 )

определение функции:

   declaration-specifiers declarator declaration-listopt compound-statement

В вашем случае declaration-specifiers - это int, declarator - это main(void), и теперь вы находитесь в declaration-list_opt, который поддерживает определения K & R, такие как int main(argc, argv) int argc; char **argv { }.

Определение функции K & R с комментариями:

/*the old declarator mirrors usage
  -- it takes an identifier list rather than a param-declarator list
  (http://port70.net/~nsz/c/c11/n1570.html#6.7.6)
*/

int main(argc, argv)

/*the types of the identifiers are then declared*/

int argc;
char **argv;

/*and only then comes the function body
  which is technically a compound statement
*/
{
}

В вашем случае, declaration-list_opt соответствует:

int i, j, m[5][5];

, что семантически не имеет смысла с main(void) (объявление массива не имеет смысла для любого декларатора функции, на самом деле, так как массивы передаются как указатели), но проверка, которая будет частью семантической проверки, которая обычно выполняется после проверки синтаксиса.

После declaration-list_opt, compound-statement (т.е., {} - тело функции с скобками) синтаксически ожидается. for не соответствует этому синтаксическому ожиданию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...