__attribute__((noreturn))
GNU C 的一大特色就是__attribute__ 机制,__attribute__ 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。
语法格式为: __attribute__((attribute-list))
当__attribute__ 用于修饰函数时,它就相当于一个函数说明符,跟 inline 等同一类
__attribute__((noreturn)) :这个属性告诉编译器函数永远不会有返回值,可以避免当一个函数需要返回值,在某种条件下未能执行到返回值处编译器警告或报错。
C库函数 abort() 函数和 exit() 函数都使用此属性声明
void exit(int) __attribute__((noreturn));void abort(void) __attribute__((noreturn));
验证例子如下:
attribute.c(exit_my() 函数未声明为 __attribute__((noreturn)) 属性)
#include <stdio.h>
#include <stdlib.h>void exit_my()
{exit(1);
}int get_v(int v)
{if (v < 3)exit_my();elsereturn v;
}void print_v(int v)
{printf("v = %d\n", v);
}int main(int argc, char *argv[])
{int i = get_v(5);print_v(i);return 0;
}
这时,编译代码时,有警告信息
attribute.c(将 exit_my() 函数声明为 __attribute__((noreturn)) 属性)
#include <stdio.h>
#include <stdlib.h>__attribute__((noreturn)) void exit_my()
{exit(1);
}int get_v(int v)
{if (v < 3)exit_my();elsereturn v;
}void print_v(int v)
{printf("v = %d\n", v);
}int main(int argc, char *argv[])
{int i = get_v(5);print_v(i);return 0;
}
这时,编译代码时,没有警告信息
参考:
__attribute__ 机制详解_weaiken的博客-CSDN博客