为什么在不包含 stdlib.h 的情况下调用 system() 仍然有效?

GPW*_*PWR 1 c eclipse linux debian gcc

我在 C 程序中包含的唯一库是stdio.h. system()无论如何,在同一个程序中调用都是有效的,尽管 Eclipse 抱怨implicit declaration of function \xe2\x80\x98system\xe2\x80\x99 [-Wimplicit-function-declaration],无论这意味着什么。

\n

然而,GCC(我正在使用的编译器)似乎很高兴。Eclipse 是否会在编译前自动修复问题,或者 GCC 是否会善意地这样做而不会抱怨?我对此一无所知。

\n

我正在使用 GNU/Linux Debian 11 (Bullseye) Stable,如果这有什么区别的话。

\n

Ste*_*mit 5

曾几何时,C 语言的规则是,如果您调用编译器从未听说过的函数,它会悄悄地假设它是一个返回 的普通函数int

system()函数符合该描述。

在最新版本的 C 标准中,“隐式int”规则已被删除,并且您需要在调用所有函数之前声明它们。如果您未能声明被调用的函数,现代编译器有义务发出诊断。但是,没有什么可以阻止编译器将诊断结果视为非致命警告,并继续利用旧的假设来编译您的程序。事实上,许多编译器仍然这样做,也许是为了更容易编译根据旧规则编写的旧代码。