c - 不带参数调用 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 函数未声明返回整数,则进程的退出状态未定义.
解决方案
如果您忘记原型(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
将尝试抓取可能是“陷阱表示”,然后您会崩溃,否则它将简单地抓取并使用一些垃圾整数值。)
推荐阅读
- java - 错误:类 SupportMapFragment 中的方法 getMapAsync 不能应用于给定类型;
- c# - I'm getting extra string char when I use GetBody
() for BrokeredMessage but works perfect with GetBody () c# - android - 有没有办法在统一为android构建游戏后加载文本
- c++ - 操作员删除抛出异常与放置新
- regex - REGEXMATCH and MATCH don't work when a cell contains a number
- ios - 使用 XMPP Openfire 的 Apple 推送通知
- java - Android: Dagger 2 interferes with Immutables?
- c# - Nesting projects within projects?
- python - psycopg2.ProgrammingError: syntax error at or near "select"
- android - 添加外部库后如何构建发布apk?