在第199页(第7.3节)的“UNIX环境中的高级编程”中,我阅读:



我编写了一个简单的程序来验证这一点:

#include <stdio.h>
#include <unistd.h>

int main() {
    exit();
}

但是gcc source.c抱怨:



怎么可能呢?它们的意思是“直接从程序集调用”吗?

编辑:该段说:

最佳答案

如果您忘记了原型(prototype)(ANSI C发明),而只是简单地将exit声明为采用K&R风格的未指定数量的参数

void exit();/*unspecified number of parameters*/

那你就可以
void exit();/*unspecified number of parameters*/
int main()
{
    exit(1);
}

这是一个格式正确的程序。

使用这种类型的声明,编译器不会阻止您完全忽略该参数:
void exit();
int main()
{
    exit();
}

但这在技术上是不确定的C。

实际上,exit在单独的转换单元(标准库)中,因此编译器无法将其弄乱,并且上面的代码将崩溃还是返回一些垃圾值取决于代码尝试读取寄存器时计算机的操作。或具有未指定内容的存储位置。
(未指定的内容exit将尝试获取的内容可能是“陷阱表示形式”,然后您将崩溃,否则它将仅获取并使用一些垃圾整数值。)

07-28 02:56
查看更多