首页 > 解决方案 > 不带参数调用 exit()

问题描述

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

如果 (a) 这些函数 [exit, _exit, _Exit] 中的任何一个在没有退出状态的情况下被调用

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

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

int main() {
    exit();
}

gcc source.c抱怨:

source.c:5:5: 错误:函数“退出”的参数太少</p>

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

编辑:该段说:

所有三个退出函数都需要一个整数参数,我们称之为退出状态。大多数 UNIX 系统 shell 提供了一种检查进程退出状态的方法。如果 (a) 这些函数中的任何一个在没有退出状态的情况下被调用,(b) main 执行没有返回值的返回,或者 (c) main 函数未声明返回整数,则进程的退出状态未定义.

标签: clinux

解决方案


如果您忘记原型(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将尝试抓取可能是“陷阱表示”,然后您会崩溃,否则它将简单地抓取并使用一些垃圾整数值。)


推荐阅读