GCC-__attribute__()(一)属性机制
简介
__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("main\n");return 0;
}static void init(void)
{printf("init\n");
}static void deinit(void)
{printf("deinit\n");
}
然后正常编译(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__编译属性section子项构建初始化函数表【转】
转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的 ...
- [小技巧] gcc attribute error 属性小试
gcc __attribute__ 里有一个属性是 error 能够用于编译时报错. 參考: https://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Functio ...
- Qt元对象和属性机制
Qt元对象和属性机制 1. 元对象 元对象(meta object)意思是描述另一个对象结构的对象,比如获得一个对象有多少成员函数,有哪些属性.在Qt中,我们将要用到的是QMetaObject这个类. ...
- Objective-C中的属性机制
Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现.在学习OC中属性之前我们先要知道为什么要为变量实现gett ...
- Mars3D开发基础学习:Property属性机制
平台是数据驱动和 time-dynamic visualization,这些可都是仰仗Property属性机制来实现的. Property最大的特点是和时间相互关联,在不同的时间可以动态地返回不同的属 ...
- GNU C - Using GNU GCC __attribute__ mechanism 01 Function Attribute
近来阅读glibc源码的时候遇到很多关于__attribute__的问题,索性就查找了相关的资料,学习了一下. 要是不解决了这个问题,有的时候还真的是比较难下手.就拿glibc来说,使用xcscope ...
- gcc __attribute__关键字举例之visibility
visibility用于设置动态链接库中函数的可见性,将变量或函数设置为hidden,则该符号仅在本so中可见,在其他库中则不可见. g++在编译时,可用参数-fvisibility指定所有符号的可见 ...
- GCC的__attribute__ ((constructor))和__attribute__ ((destructor))
通过一个简单的例子介绍一下gcc的__attribute__ ((constructor))属性的作用.gcc允许为函数设置__attribute__ ((constructor))和__attrib ...
- linux模块化机制,Linux模块化机制和module_init
> 引子:模块化机制优点 模块化机制(module)是Linux系统的一大创新,是Linux驱动开发和运行的基础(当然,module并不仅仅是支撑驱动).其优点在于: 1.在系统运行动态加载模块 ...
最新文章
- powerdesigner逆向工程,从数据库导出PDM
- 提取变异的转录组序列
- iOS toolchain based on clang for linux
- 转载:javaweb学习总结(二十三)——jsp自定义标签开发入门
- 干货报告:八大科技领域,280 页,InfoQ《2020 中国技术发展白皮书》开放下载...
- 高级php程序员面试题2019,2019最新PHP模拟面试题及答案
- P7888-「MCOI-06」Distinct Subsequences【dp】
- Facebook轮播连结广告可展示5个图像与连结
- 单线驱动74hc595(转)
- 基于BP神经网络识别手写字体MINST字符集
- MySQL-多表操作
- Django:发送邮件
- 卸载360天擎企业版需要密码
- 开发人员新常态:和云原生相爱相杀
- HBuilder 设置 主题 背景颜色
- 很全的大数据分析平台
- 年终总结2019-2020
- mysql错误+126_MySQL,错误126:表的密钥文件不正确
- 主流报表开发工具FastReport.Net全新发布,邀您体验最新版试用
- raid 物理盘缓存状态_Dell PowerEdge系列服务器RAID和物理磁盘开机自检错误信息及说明...
热门文章
- 重新开始Java的原始字符串文字讨论
- cglib_cglib:缺少的手册
- 在Google Cloud Platform的K8上运行Fn函数
- 注意Java 8的[Pri​​mitive] Stream.iterate()中的递归
- envers_分代缓存和Envers
- orderby排序慢_使用@OrderBy对Spring Data MongoDB集合进行排序
- WildFly 10 CR 2发布– Java EE 7,Java 8,Hibernate 5,JavaScript支持热重载
- 休眠锁定模式– PESSIMISTIC_READ和PESSIMISTIC_WRITE如何工作
- Hibernate Collection乐观锁定
- 在OpenShift上托管的WildFly实例上进行Arquillian测试