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();
else
return 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();
else
return 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博客