为什么“隐式函数声明”只是一个警告?

mah*_*fat 5 c warnings compilation compiler-warnings linkage

这不是一个关于如何解决 C 程序中出现的“隐式函数声明”警告的问题,这个问题已经回答了很多次。

我知道这是一个编译器警告,我想知道为什么这是一个警告而不是错误?如果编译器看不到该函数,那么在运行时调用该函数时会发生什么?链接器最终能解决这个问题吗?或者我们是否假设调用产生此类警告的函数的行为是未知的?

ale*_*ius 4

为什么这是警告而不是错误?

因为有很多遗留代码都是以这种方式编写的。编译器错误会破坏它。

如果编译器看不到该函数,那么在运行时调用该函数时会发生什么?链接器最终能解决这个问题吗?

让我们看一下例子:

int main()
{
    foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

工作时,编译器会生成自己的函数签名,例如int foo(...)并将使用它。顺便说一句,它可能会导致非常奇怪的错误。所以目标文件会包含这个函数的调用,就可以了。当您尝试链接它时,您将收到错误:对“foo”的未定义引用。但是,如果您有另一个带有foo定义的模块,链接器将通过名称找到它并链接它。

或者我们是否假设调用产生此类警告的函数的行为是未知的?

正如我所说,这可能会导致一些奇怪的错误。想象一下,您有类似 和 的代码int i = foo(),但foo没有签名。在另一个模块中,您有以下内容:int * foo(){...}。在 64 位模式下构建应用程序时,您将仅放置i64 位指针的 32 位。所以你可能会说事实上你的程序的行为可能是未知的。