我读了关于属性的这个问题noreturn,它用于不返回调用者的函数.
然后我用C做了一个程序.
#include <stdio.h>
#include <stdnoreturn.h>
noreturn void func()
{
printf("noreturn func\n");
}
int main()
{
func();
}
Run Code Online (Sandbox Code Playgroud)
并使用以下代码生成代码的汇编:
.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
Run Code Online (Sandbox Code Playgroud)
为什么函数func()在提供noreturn属性后返回?
我们正在接受GCC 7的警告,因为它在switch语句中是隐含的.以前,我们在Clang下清除它们(这是下面评论的原因):
g++ -DNDEBUG -g2 -O3 -std=c++17 -Wall -Wextra -fPIC -c authenc.cpp
asn.cpp: In member function ‘void EncodedObjectFilter::Put(const byte*, size_t)’:
asn.cpp:359:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
m_state = BODY; // fall through
^
asn.cpp:361:3: note: here
case BODY:
^~~~
Run Code Online (Sandbox Code Playgroud)
在GCC手册状态使用__attribute__ ((fallthrough)),但它不便于携带.该手册还指出"...也可以添加一个通过注释来消除警告",但它只提供FALLTHRU(这真的是唯一的选择吗?):
switch (cond)
{
case 1:
bar (0);
/* FALLTHRU */
default:
…
}
Run Code Online (Sandbox Code Playgroud)
对于Clang和GCC,是否有通过警告来清除坠落的便携方法?如果是的话那么它是什么?
noreturn永不归还函数的属性是否必要,或者这只是一个(可能是不成熟的? - 至少对于退出,我无法想象为什么要优化)优化?
向我解释说,在诸如此类的背景下
void myexit(int s) _Noreturn {
exit(s);
}
// ...
if (!p) { myexit(1); }
f(*p);
/// ...
Run Code Online (Sandbox Code Playgroud)
noreturn防止!p分支被优化.但是编译器是否真的允许优化该分支?我意识到优化它的基本原理是:"未定义的行为不会发生.如果p== NULL,则解除引用它是UB,因此p永远不会NULL在此上下文中,因此!p分支不会触发".但是编译器不能通过假设myexit可能是一个不返回的函数来解决问题(即使它没有明确标记为这样)?
我遇到了"高度可读"和"优雅"代码的"漂亮"示例,但我遇到了麻烦:
struct S {
[[noreturn]] virtual inline auto f(const unsigned long int *const)
–> void const noexcept;
};
Run Code Online (Sandbox Code Playgroud)
这是我的理解(如果我错了,请纠正我):
f() 是...的成员函数 Svirtual - 可以被派生类覆盖inline- 编译器应该尝试为调用生成代码f而不是正常调用它const- 该功能无法更改任何S成员noexcept - 该函数永远不会抛出(不能扔或不允许抛出)const指向a的指针const unsigned long intauto .... -> void - 后缀返回类型 void[[noreturn]]-它从来没有returnŠ以下是我的主要关注点:
[[noreturn]],它永远不会返回给它的调用者; 那它怎么会有一个返回类型void?无论如何,这个函数的返回类型有什么意义?int而不是void例如?})后,代码的流程在哪里?我无法在VS2013预览版上运行此代码,所以我猜这些功能尚未实现.
我对此非常好奇,所以如果有人能解释我会很感激!干杯
据我了解,该属性告诉编译器函数不会返回。当函数返回 void 时指定 this 有什么好处?
这两个功能有何不同?
void foo(){}
__attribute__((noreturn)) void foo(){}
Run Code Online (Sandbox Code Playgroud) 据我所知,[[maybe_noreturn]]C++ 中没有属性。
我有一个如下所示的函数:
void func() {
try {
do_something();
} catch (const std::exception& e) {
std::exit(1);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我标记func为[[noreturn]]我会遇到 UB 的快乐案例。当我没有从未标记为 的函数返回时,这是 UB 吗[[noreturn]]?
或者是否有其他语言结构、编译器扩展或库可以实现类似的功能[[maybe_noreturn]]?