隐式函数声明有时在 C 中工作?

rmp*_*251 2 c function forward-declaration implicit-declaration

有人可以向我解释为什么以下编译:

int main()
{
    int a = mymethod(0);
}
int mymethod(int b)
{
    return b;
}
Run Code Online (Sandbox Code Playgroud)

但这不会:

int main()
{
    mymethod(0);
}
void mymethod(int b)
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

我认为在 C/C++ 中需要前向声明,但这里有一个反例。隐式声明如何在 C 中工作?

jxh*_*jxh 5

我假设当您说它在第二个代码示例中不起作用时,您的意思是您遇到了编译时错误。

原因是当存在隐式函数声明时,假定采用固定数量的参数,并返回int。但是,mymethod()首先隐式声明,然后声明为 return void。这是一个错误,因为新声明与之前的(隐式)声明不匹配。

C90 (ANSI C89) 允许隐式函数声明。来自 C89,第 3.3.2.2 节:

如果函数调用中带括号的参数列表前面的表达式仅由一个标识符组成,并且没有对该标识符可见的声明,则该标识符被隐式声明,就像在包含函数调用的最里面的块中一样,声明

extern int 标识符();
出现了。

但是,从 C99 开始,此限额已被取消(因此在 C11 中也被禁止)。C++ 从不允许隐式函数声明。

  • 此外,在 C99 和 C11 中,对没有可见声明的函数的调用是*约束违规*。这意味着符合标准的编译器必须发出诊断,但不一定是致命错误。即使符合标准的 C99 编译器也可以发出警告,然后使用 C90 语义。(“gcc -std=c99 -pedantic”就是这样做的;如果您希望错误是致命的,则需要使用“-pedantic-errors”。) (2认同)