我读到了关于noreturn属性的this问题,该属性用于不返回给调用者的函数。
#include <stdio.h>
#include <stdnoreturn.h>
noreturn void func()
{
printf("noreturn func\n");
}
int main()
{
func();
}并使用this生成代码的汇编
.LC0:
.string "func"
func:
pushq %rbp
movq %rsp, %rbp
movl $.LC0, %edi
call puts
nop
popq %rbp
ret // ==> Here function return value.
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
call func为什么在提供func() noreturn 属性后,function 返回?
发布于 2017-08-31 20:35:18
C中的函数说明符是对编译器的一个提示,接受程度是由实现定义的。
首先,_Noreturn函数说明符(或者,noreturn,使用<stdnoreturn.h>)是对编译器的一个提示,表明程序员做出了一个理论上的承诺,这个函数永远不会返回。基于这个承诺,编译器可以做出一定的决策,对代码生成进行一些优化。
为了清楚起见,使用noreturn函数说明符不会停止函数返回给调用者。这是程序员对编译器做出的承诺,允许编译器在一定程度上生成优化的代码。
现在,以防万一,你早晚做出了承诺,选择违反它,结果是UB。当_Noreturn函数似乎能够返回其调用方时,鼓励编译器生成警告,但不是必需的。
示例2中止无效f () { _Noreturn ();// ok } _Noreturn void g (int i) { //如果I <= 0 if (i > 0) _Noreturn();}会导致未定义的行为
对于C++来说,这种行为非常相似。
如果在先前使用f noreturn 属性声明了noreturn的位置调用了函数,并且<>e147>最终返回,则行为未定义。注意:该函数可能会抛出异常而终止。-end笔记
-end备注]
3[示例:
[ noreturn ] void f() {抛出“错误”;//确定}[ noreturn ] void q(int i) { //如果使用参数<= 0调用,如果(i > 0)抛出“正”,则行为未定义;}
-end示例]
发布于 2017-08-31 20:35:35
为什么函数func()在提供无返回属性后返回?
因为你写的代码告诉它。
如果你不想让你的函数返回,可以调用exit()或者abort()或者类似的函数,这样它就不会返回。
在调用printf()之后,除了返回之外,您的函数还能做什么
6.7.4函数说明符中的C Standard第12段特别包含了一个可以实际返回的noreturn函数的示例,并将该行为标记为未定义
示例2
_Noreturn void f () {
abort(); // ok
}
_Noreturn void g (int i) { // causes undefined behavior if i<=0
if (i > 0) abort();
}简而言之,noreturn是对您的代码施加的限制-它告诉编译器“我的代码永远不会返回”。如果你违反了这个限制,那都是你的错。
发布于 2017-08-31 21:36:40
noreturn是一个承诺。您告诉编译器,“这可能很明显,也可能不明显,但我知道,根据我编写代码的方式,这个函数永远不会返回。”这样,编译器就可以避免设置允许函数正确返回的机制。省略这些机制可能会让编译器生成更高效的代码。
一个函数怎么能不返回呢?一个例子是如果它调用exit()。
但是,如果你向编译器承诺你的函数不会返回,而编译器没有安排函数正确返回,然后你去写一个返回的函数,那么编译器应该做什么呢?它基本上有三种可能性:
编译器可能会执行1、2、3或某种组合。
如果这听起来像是未定义的行为,那是因为它确实如此。
正如在现实生活中一样,编程的底线是:不要做出你不能信守的承诺。其他人可能已经根据你的承诺做出了决定,如果你违背了你的承诺,就会发生糟糕的事情。
https://stackoverflow.com/questions/45981545
复制相似问题