我想了解错误的性质“在'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会在函数头后面期望什么。
提前谢谢
答案 0 :(得分:7)
解析器首先检查语法。 函数定义的语法为(6.9.1)
功能定义:
declaration-specifiers declarator declaration-listopt compound-statement
在您的情况下,declaration-specifiers
是int
,declarator
是main(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
未能达到语法期望。