为什么在不包含 stdlib.h 的情况下调用 system() 仍然有效?
Why does calling system() without including stdlib.h still work?
我在 C 程序中包含的唯一库是 stdio.h
。在同一个程序中调用 system()
仍然有效,尽管 Eclipse 抱怨 implicit declaration of function ‘system’ [-Wimplicit-function-declaration]
,不管那是什么意思。
但是,GCC(我正在使用的编译器)似乎很高兴。是 Eclipse 会在编译前自动修复问题,还是 GCC 只是善意地做到这一点而不会抱怨?我对此一无所知。
我正在使用 GNU/Linux Debian 11 (Bullseye) 稳定版,如果有任何不同的话。
曾几何时,C 中的规则是,如果您调用一个编译器从未听说过的函数,它会悄悄地假定它是一个返回 int
.
的普通函数
system()
函数符合该描述。
在较新的 C 标准版本中,“隐式 int
”规则已被删除,您需要在调用函数之前声明所有函数。如果您未能声明被调用函数,现代编译器有义务发出诊断。但是,没有什么可以阻止编译器将诊断作为非致命警告,并继续编译您的程序,利用旧的假设。事实上,许多编译器仍然这样做,也许是为了更容易编译根据旧规则编写的旧代码。
我在 C 程序中包含的唯一库是 stdio.h
。在同一个程序中调用 system()
仍然有效,尽管 Eclipse 抱怨 implicit declaration of function ‘system’ [-Wimplicit-function-declaration]
,不管那是什么意思。
但是,GCC(我正在使用的编译器)似乎很高兴。是 Eclipse 会在编译前自动修复问题,还是 GCC 只是善意地做到这一点而不会抱怨?我对此一无所知。
我正在使用 GNU/Linux Debian 11 (Bullseye) 稳定版,如果有任何不同的话。
曾几何时,C 中的规则是,如果您调用一个编译器从未听说过的函数,它会悄悄地假定它是一个返回 int
.
system()
函数符合该描述。
在较新的 C 标准版本中,“隐式 int
”规则已被删除,您需要在调用函数之前声明所有函数。如果您未能声明被调用函数,现代编译器有义务发出诊断。但是,没有什么可以阻止编译器将诊断作为非致命警告,并继续编译您的程序,利用旧的假设。事实上,许多编译器仍然这样做,也许是为了更容易编译根据旧规则编写的旧代码。