我有一个函数定义为:
int f_2() {
rand();
return 10;
}
clang 将其分为 3 个基本 block 。这是可以理解的。
但是,当我用 exit(0) 替换对 rand() 的调用时,它会将其分成 4 个基本 block 。 维基百科 ( http://en.wikipedia.org/wiki/Basic_block ) 表示无法返回的函数可能位于基本 block 的末尾。
clang 如何知道 exit() 函数没有返回? 我正在使用 clang -c 编译我的代码。
最佳答案
clang
是一个C编译器;它可以利用语言标准对标准库函数所做的保证。
<stdlib.h>
的具体实现中也可能存在一些问题。这使得exit()
作为不返回的函数,可能使用语言扩展或 _Noreturn
2011 ISO C 标准添加的关键字。
另一个例子:调用 sin(0.0)
,与 -O1
或更高版本,编译为文字 0.0
,因为编译器知道 sin
功能。 (这意味着调用 sin(0.0)
的程序只有在不优化的情况下才需要与 -lm
链接。)
这都是允许的,因为定义自己的(非 static
)与标准库函数同名的函数具有未定义的行为;编译器不需要考虑调用 exit
的可能性或sin
执行标准为这些函数指定的内容之外的任何操作。
关于c - 为什么调用 exit 函数会创建一个新的基本 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714325/