当函数头不带复合语句时,C会理解什么?

时间:2018-12-20 22:54:59

标签: c

我想了解错误的性质“在'for'之前的预期声明说明符”和“在'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 :(得分:7)

解析器首先检查语法。 函数定义的语法为(6.9.1

  

功能定义:

   declaration-specifiers declarator declaration-listopt compound-statement

在您的情况下,declaration-specifiersintdeclaratormain(void),现在 您在declaration-list_opt中,该位置支持诸如int main(argc, argv) int argc; char **argv { }之类的K&R定义。

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未能达到语法期望。