概述
简介
__attribute__((option
))是编译器对C语言的扩展,可以设置特定的函数、变量和类型的相关属性。
使用场景
主要用于优化代码,保证编码正确,优化程序逻辑,优化存储格式等,正常简单的项目都没必要使用。
属性列表(常用)
属性名称 | 作用域 (F:函数, V: 变量,T: 类型) | 含义 | 备注 |
---|---|---|---|
constructor | F | 使被修饰的函数在main函数前被执行 | |
destructor | F | 使被修饰的函数在main函数结束后被执行 | |
format | F | 告诉编译器,按照printf, scanf, strftime或strfmon的参数表格式规则对该函数的参数进行检查 | |
noreturn | F | 表示这个函数没有返回值也不能有返回值 | |
const | F | 表示一个方法的返回值只由参数决定,如果参数不变的话,就不再调用此函数,直接返回值 | |
weak | F | 弱函数,如果同名函数在其他地方被定义将使用其他地方的函数,当其他地方没有定义才使用该函数 | |
warn_unused_result | F | 表明函数返回值必须被接收或使用,否则将编译报错 | 建议修饰所有返回动态内存地址和如果执行错误将导致后续流程执行并返回错误码的函数 |
cleanup() | V | 用于修饰变量,在变量作用域结束后调用指定函数 | |
always_inline | F | 保证代码是内联的,强制内联 | 不一定有效,具体还是得看编译器 |
section("name") | FV | 在编译时将被修饰的函数或数据放入指定名为"name"对应的段中 | 需要修改链接脚本才能生效 |
aligned(n) | VT | 格式化对齐,强制编译器为结构体分配空间时采用规定位对齐,不指定数字时,编译器自动选择对目标机器最优方式 | |
nothrow | F | 属性告诉编译器函数不能抛出异常(当代码会被C++调用时才使用) | |
packed | VT | 告诉编译器取消结构在编译过程中的优化对齐, 按照实际占用字节数进行对齐 | |
pure | F | 函数除返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。 | |
nonull(n) | ‘F’ | 函数第n 个参数不能为NULL | 多个参数时使用逗号隔开 |
… |
注:
如果不确定属性是否支持或存在,可以使用关键宏
__has_attribute
,进行判定。#ifndef __has_attribute /*!< 判断一下是否支持 __has_attribute */ #warning Unsupport __has_attribute #define __has_attribute(x) 0 #endif #if __has_attribute(visibility) /*!< 判断一下是否支持 visibility*/ #define ATTR_EXTERNAL_API __attribute__((visibility("default"))) #define ATTR_LOCAL_API __attribute__((visibility("hidden"))) #else #error Unsupport visibility. #endif
使用格式
标准的使用位置是放置在声明的尾部的;
之前。
多个属性使用,
隔开,如int hello(void) __attribute__((noreturn,constructor));
使用示例
#include <stdio.h>
/**
* @brief 定义一个函数init,使用属性`constructor`修饰,使该函数在main函数执行前执行.
*/
static void init(void) __attribute__((constructor));
/**
* @brief 定义一个函数deinit,使用属性`constructor`修饰,使该函数在main函数执行后执行.
*/
static void deinit(void) __attribute__((destructor));
int main(int argc, char **argv)
{
printf("mainn");
return 0;
}
static void init(void)
{
printf("initn");
}
static void deinit(void)
{
printf("deinitn");
}
然后正常编译(ubuntu 16.04x64)
gcc -o test test.c
执行程序:
root@seven: ~/projects/test# ./test
init
main
deinit
root@seven: ~/projects/test#
函数init
在main
之前执行,函数deinit
在main
之后执行。
最后
以上就是糟糕心锁为你收集整理的GCC-__attribute__()(一)属性机制简介使用场景属性列表(常用)使用格式的全部内容,希望文章能够帮你解决GCC-__attribute__()(一)属性机制简介使用场景属性列表(常用)使用格式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复