我是靠谱客的博主 超级酒窝,最近开发中收集的这篇文章主要介绍C/C++编程:__attribute__ noreturn为什么要有__attribute__((noreturn))其他例子,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一些库函数,本身没有返回值,例如abort()和exit(),在编译的时候,GCC自动按照这个规则编译。而对于自己定义的函数,如果你不想让它有返回值,那么可以使用__attribute__ ((noreturn))

__attribute__ noreturn

  • 这个属性告诉编译器函数不会返回。当遇到函数需要返回值却还没运行到返回值处就已退出来的情况,该属性可以避免出现错误信息。
  • 用来抑制关于未达到代码路径的错误

C库函数中的abort()和exit()的声明格式就采用了这种格式:


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

为什么要有__attribute__((noreturn))

#include <stdio.h>
#include <stdlib.h>

extern void myexit(int);

int testFunc(void)
{
    printf("-- Enter %s --", __func__);

    myexit(0);

    // 其实函数运行不到这里
    printf("-- Exit %s --", __func__);
}

void myexit(int i)
{
    exit(i);
}

int main()
{

    return 0;
}

编译器会警告:

C:UsersAdministratorCLionProjectsnnnmain.cpp: In function 'int testFunc()':
C:UsersAdministratorCLionProjectsnnnmain.cpp:14:1: warning: no return statement in function returning non-void [-Wreturn-type]

在这里插入图片描述
所以应该定义为:

#include <stdio.h>
#include <stdlib.h>

extern void myexit(int) __attribute__((noreturn));

int testFunc(void)
{
    printf("-- Enter %s --", __func__);

    myexit(0);

    // 其实函数运行不到这里
    printf("-- Exit %s --", __func__);
}

void myexit(int i)
{
    exit(i);
}

int main()
{

    return 0;
}

其他例子

#include <stdio.h>
#include <stdlib.h>

 void fatal(char *message) __attribute__((noreturn));  // 告诉编译器这个函数不会返回给调用者,以便编译器在优化时去掉不必要的函数返回代码。


 void fatal(char *message)
{
    fprintf(stderr, "FATAL ERROR:%sn", message);
    exit(0); // 必须是exit
}


void foo(){

 }


int main()
{
    fatal("aaaaaaaaa");
    foo(); // 永远不会被执行
    return 0;
}

最后

以上就是超级酒窝为你收集整理的C/C++编程:__attribute__ noreturn为什么要有__attribute__((noreturn))其他例子的全部内容,希望文章能够帮你解决C/C++编程:__attribute__ noreturn为什么要有__attribute__((noreturn))其他例子所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部