__attribute__((noreturn))的用法

Posted sea-stream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__attribute__((noreturn))的用法相关的知识,希望对你有一定的参考价值。

 

这个属性告诉编译器函数不会返回,这可以用来抑制关于未达到代码路径的错误。 C库函数abort()和exit()都使用此属性声明:

extern void exit(int)   __attribute__((noreturn));
extern void abort(void) __attribute__((noreturn));

Once tagged this way, the compiler can keep track of paths through the code and suppress errors that won‘t ever happen due to the flow of control never returning after the function call.

In this example, two nearly-identical C source files refer to an "exitnow()" function that never returns, but without the __attribute__tag, the compiler issues a warning. The compiler is correct here, because it has no way of knowing that control doesn‘t return.

$ cat test1.c
extern void exitnow();

int foo(int n)

        if ( n > 0 )
    
                exitnow();
        /* control never reaches this point */
    
        else
                return 0;


$ cc -c -Wall test1.c
test1.c: In function `foo:
test1.c:9: warning: this function may return with or without a value

 

But when we add __attribute__, the compiler suppresses the spurious warning:

$ cat test2.c
extern void exitnow() __attribute__((noreturn));

int foo(int n)

        if ( n > 0 )
                exitnow();
        else
                return 0;


$ cc -c -Wall test2.c
no warnings!

 

参考:

https://blog.csdn.net/qq_26093511/article/details/53306323

 

 

以上是关于__attribute__((noreturn))的用法的主要内容,如果未能解决你的问题,请参考以下文章

C 语言编程 — GCC Attribute 语法扩展

C 语言编程 — GCC Attribute 语法扩展

__attribute__((section(”name“)))的一些理解

XCODE unknown type name __declspec 错误的解决方法

声明函数的属性

《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法