了解甚少的GNU C的__attribute__ 机制
平时忙着赶项目,很多东西都是不求甚解,当工作中遇到的一些比较刁钻的问题时,才发现自己和那些大牛的
差距---内功。熟练码农和码神的最大区别估计就是内功是否深厚了。在自我反思的过程中,也要逐渐的积累一些很
基本的知识,争取能烂熟于心,这样,才能做出高质量的产品。
最近遇到了一个__attribute__ 机制相关的问题,在这里栽了跟头,就要好好总结一下,免得在以后的岁月中,再
犯类似的错误。
其实,GNU C 的一大特色就是__attribute__ 机制。这种机制在嵌入式系统中应用十分广泛,它的神奇作用就表现
在三个地方:
设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute )。
我也就针对这三个属性做个总结吧。
函数属性(Function Attribute )
函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大。__attribute__
机制也很容易同非GNU应用程序做到兼容之功效。GNU CC需要使用 –Wall编译器来击活该功能,这是控制警告信息的一个很
好的方式。
格式:__attribute__ format
该__attribute__属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间
的格式化字符串是否匹配。该功能十分有用,尤其是处理一些很难发现的bug。
example:
__attribute__((format(printf,m,n)))
__attribute__((format(scanf,m,n)))
m:第几个参数为格式化字符串(format string);
n:参数集合中的第一个,即参数“…”里的第一个参数在函数参数总数排在第几,注意,有时函数参数里还有“隐身”的呢,后面会提到;
源码实例参考:http://www.keil.com/support/man/docs/armcc/armcc_sam1436458756975.htm
http://unixwiz.net/techtips/gnu-c-attributes.html
变量属性(Variable Attribute )
编译器的关键字 __attribute__ 用来指定变量或结构位域的特殊属性。关键字后 双括弧中的内容是属性说明。常用的关键字都有
哪些呢?
section ("section-name")
packed
aligned (alignment)
举个例子:
在操作系统中常用的 __attribute__ ((section("name"))) .....
就是通过着来实现的,这个的作用主要是:
编译生成的object file,代码会保存在".text"段,全局变量和静态变量会放在".data"和".bss"(未初始化的全局变量和局部静态变量)
利用GCC的扩展机制就可以做到自定义段了.
关于变量的还有其他例子,写的比较详细,需要可以参考:
http://www.cnblogs.com/respawn/archive/2012/07/09/2582078.html
http://www.cnblogs.com/astwish/p/3460618.html
类型属性(Type Attribute )
类型属性主要用在结构体的操作上,其实很多时候和变量属性结合使用的,下面的实例可以很好说明类型属性 的作用和使用方法:
代码:
struct p
{
int a;
char b;
short c;
}__attribute__((aligned())) pp;
struct m
{
char a;
int b;
short c;
}__attribute__((aligned())) mm;
struct o
{
int a;
char b;
short c;
}oo;
struct x
{
int a;
char b;
struct p px;
short c;
}__attribute__((aligned())) xx;
int main()
{
printf("sizeof(int)=%d,sizeof(short)=%d.sizeof(char)=%d\n",sizeof(int),sizeof(short),sizeof(char));
printf("pp=%d,mm=%d \n", sizeof(pp),sizeof(mm));
printf("oo=%d,xx=%d \n", sizeof(oo),sizeof(xx));
return ;
}
输出结果:
sizeof(int)=,sizeof(short)=.sizeof(char)= pp=,mm= oo=,xx=
了解甚少的GNU C的__attribute__ 机制的更多相关文章
- GNU C 扩展之__attribute__ 机制简介
在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attribute__的相关使用.本文结合自己的学习经历,较为详细的介绍了__attribute__相关语法及 ...
- GNU C __attribute__ 机制简介
摘要: 在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attribute__的相关使用.本文结合自己的学习经历,较为详细的介绍了__attribute__相 ...
- __attribute__机制介绍
转载:http://blog.csdn.net/ithomer/article/details/6566739 1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__att ...
- __attribute__机制介绍 (转)
1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__attribute__机制. __attribute__可以设置函数属性(Function Attribute).变量 ...
- 【转】__attribute__机制介绍
1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__attribute__机制. __attribute__可以设置函数属性(Function Attribute).变量 ...
- __attribute__ 机制详解(一)
GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型 ...
- __attribute__ 机制详解
GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型 ...
- Linux内核入门(六)—— __attribute__ 机制【转】
转自:https://blog.csdn.net/yunsongice/article/details/5538020 GNU C的一大特色(却不被初学者所知)就是__attribute__机制.__ ...
- __attribute__机制介绍(转)
转自 http://blog.csdn.net/ithomer/article/details/6566739 1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__att ...
随机推荐
- ide调试
F8: 程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行) F7: 程序向下执行一行.如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法) Alt + ...
- JS全局对象的属性
全局对象是最顶层的对象,在浏览器环境指的是window对象.在ES5中,全局对象的属性与全局变量是等价的. var str = "hello"; function test(){ ...
- 转载:轻量级Config文件AppSettings节点编辑帮助类
using System.Configuration; using System.Windows.Forms; namespace Allyn.Common { public class XmlHep ...
- IBGP规划
在IBGP邻居中,使用反射器减少IBGP邻居关系是一种最常用的网络结构,在上图中AS65001中有6台路由器,其中,R1和R2是一组反射器,配置如下: R1: ! interface Loopback ...
- LAB2
任务1: 效果:HelloWorld 好像完全按视频做就行了 学会了:把glassfish改好了,能跑 没学会:视频里的解说不懂在干嘛,得再看看 任务2 效果:intersetingpicture要求 ...
- springboot restful接口服务异常处理
一.spring boot中默认的错误处理机制 二.自定义的异常处理
- wget下载指定URL下的特定属性文件
例子:下载指定URL下的kernel开头的所有包 wget https://archives.fedoraproject.org/pub/fedora/linux/updates/28/Everyth ...
- boost asio 学习(八) 网络基础 二进制写发送和接收
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=9 8. Net ...
- js--随机产生100个从0 ~ 1000之间不重复的整数(me)
<style> div{text-indent:40px;} </style> <script> window.onload=function(){ v ...
- 1.2 eigen中矩阵和向量的运算
1.2 矩阵和向量的运算 1.介绍 eigen给矩阵和向量的算术运算提供重载的c++算术运算符例如+,-,*或这一些点乘dot(),叉乘cross()等等.对于矩阵类(矩阵和向量,之后统称为矩阵 类) ...