我是靠谱客的博主 悦耳篮球,最近开发中收集的这篇文章主要介绍了解甚少的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(4))) pp;

struct m

{

char a;

int b;

short c;

}__attribute__((aligned(4))) mm;

struct o

{

int a;

char b;

short c;

}oo;

struct x

{

int a;

char b;

struct p px;

short c;

}__attribute__((aligned(8))) xx;

int main()

{

printf("sizeof(int)=%d,sizeof(short)=%d.sizeof(char)=%dn",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 0;

}

  输出结果:

sizeof(int)=4,sizeof(short)=2.sizeof(char)=1

pp=8,mm=12

oo=8,xx=24

 

转载于:https://www.cnblogs.com/dylancao/p/8490253.html

最后

以上就是悦耳篮球为你收集整理的了解甚少的GNU C的__attribute__ 机制的全部内容,希望文章能够帮你解决了解甚少的GNU C的__attribute__ 机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部