平时忙着赶项目,很多东西都是不求甚解,当工作中遇到的一些比较刁钻的问题时,才发现自己和那些大牛的

差距---内功。熟练码农和码神的最大区别估计就是内功是否深厚了。在自我反思的过程中,也要逐渐的积累一些很

基本的知识,争取能烂熟于心,这样,才能做出高质量的产品。

  最近遇到了一个__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__ 机制的更多相关文章

  1. GNU C 扩展之__attribute__ 机制简介

    在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attribute__的相关使用.本文结合自己的学习经历,较为详细的介绍了__attribute__相关语法及 ...

  2. GNU C __attribute__ 机制简介

    摘要: 在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attribute__的相关使用.本文结合自己的学习经历,较为详细的介绍了__attribute__相 ...

  3. __attribute__机制介绍

    转载:http://blog.csdn.net/ithomer/article/details/6566739 1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__att ...

  4. __attribute__机制介绍 (转)

    1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__attribute__机制. __attribute__可以设置函数属性(Function Attribute).变量 ...

  5. 【转】__attribute__机制介绍

    1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__attribute__机制. __attribute__可以设置函数属性(Function Attribute).变量 ...

  6. __attribute__ 机制详解(一)

    GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型 ...

  7. __attribute__ 机制详解

    GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型 ...

  8. Linux内核入门(六)—— __attribute__ 机制【转】

    转自:https://blog.csdn.net/yunsongice/article/details/5538020 GNU C的一大特色(却不被初学者所知)就是__attribute__机制.__ ...

  9. __attribute__机制介绍(转)

    转自 http://blog.csdn.net/ithomer/article/details/6566739 1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__att ...

随机推荐

  1. Beta冲刺——第一天

    beta冲刺:第一天 各个成员今日完成的任务 成员 冯晓.马思远 彭辉.王爽 吴琼.郝延婷 今日完成任务 ·参会人员注册代码规范与功能测试 ·网站的前端代码调整 ·代码规范 ·系统功能测试 ·博客撰写 ...

  2. 使用@FeignClient时,报java.lang.NoClassDefFoundError: feign/Feign$Builder错

    错误信息: Caused by: java.lang.ClassNotFoundException: feign.Feign$Builder at java.net.URLClassLoader.fi ...

  3. linux 下将tomcat注册成服务并开机启动

    一.将startup.sh和shutdown.sh新建软连接到/usr/bin ln -s /usr/local/apache-tomcat-8.5.38/bin/startup.sh /usr/bi ...

  4. 第一个只出现一次的字符字符(python)

    题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).   # -*- codin ...

  5. reentrantlocklock实现有界队列

    今天找synchronize和reentrantlock区别的时候,发现有个使用reentrantlock中的condition实现有界队列,感觉挺有趣的,自己顺手敲了一遍 class Queue{ ...

  6. [leetcode]77. Combinations组合

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. Example: I ...

  7. [leetcode]11. Container With Most Water存水最多的容器

    Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). ...

  8. CentOS7 下使用root免密码输入自动登入gnome桌面

    如果系统默认启动图形界面: vi /etc/gdm/custom.conf #找到[daemon],修改为下面的 [daemon] AutomaticLoginEnable=true Automati ...

  9. 浅谈卷积和C++实现

    1 信号处理中的卷积 无论是信号处理.图像处理还是其他一些领域,我们经常会在一些相互关联的数据处理中使用卷积.卷积可以说是算法中一个非常重要的概念.这个概念最早起源于信号处理之中. 假设对于一个线性系 ...

  10. etcd-v2第三集

    简单说下golang的etcd接口例子.etcd api有v2(http+json)和v3(grpc)两个版本,目前大家都用v2,所以... v2: https://github.com/coreos ...