现在的位置: 首页 > 综合 > 正文

GNU C – Using GNU GCC __attribute__ mechanism 02 Variable Attribute && Type Attribute

2012年09月07日 ⁄ 综合 ⁄ 共 2245字 ⁄ 字号 评论关闭

上篇文章中介绍了 __attribute__ mechanism  Function Attribute   参考链接:http://www.cnblogs.com/respawn/archive/2012/07/09/2582548.html

 

我不喜欢对自己写的文章做过多的修饰,所以很不注重排版,喜欢走简约路线.  所以如果您认为我的博文排版很差而忽略文章内容的话,那么我

只能说我注重技术,不注重次要的浪费时间的无价值动作.  如果您可以对我的博文进行批评指正的话,那我这里谢过了.技术嘛,需要多讨论,多

研究,不是写出来给别人赞扬的.(上述仅代表我个人观点,如果您不喜欢,请原谅.)

 

下午有事出去了,直到刚才才回宿舍洗完澡,现在听着音乐,静下心来继续未完成的工作.

 

在之前的文章中,我给出了很多的实例操作.  在这篇文章中我就不再给出实例了,因为方法都已经很明确了.大家可以自己尝试,若有一两个的确需要给出实例

的,我会给出参考实例的.

 

一、 Variable Attribute

1. __attribute__((alias)) : 在之前的文章中有说过对于函数的限定,在这里是对变量的限定,用法很相似:

type newname __attribute__((alias("oldname")));

 

 其中的newname和oldname都不需要再解释了,和前面的文章中说的一样. 在使用的时候对于newname的操作,就是对oldname的操作.

 

2. __attribute__((aligned(ALIGNMENT))): 指定变量或结构体最小字节对齐数,以byte为单位.  

  ALIGNMENT: 指定的字节对齐操作数.

   其他的就不多说了,因为关于字节对齐这部分的内容如果需要说明白,可以单独写一篇博文了,考虑一下,有时间我回补充这一节,单独写一篇.

 

3.__attribute__((cleanup(cleanup_function)): 当一个变量的作用域消失时,便会执行后面的clean_function函数.

                   如何去理解这一点呢? 就好像是C++中的智能指针一样,当离开它的作用域的时候就会被销毁.通过使用 __attribute mechiansm cleanup属性也可以做

                   到.

 

4.__attribute__((deprecated(MSG))): 注明这是一个被弃用的变量,前面说到的是弃用的函数.

               MSG: 输出的信息.

               如果被弃用的变量在其他的地方被使用了,那么编译器就会输出warnning.但是编译还是会通过. warnning的信息中包括有弃用变量被使用的未知,通常是

               指在某个文件中某行这类的信息.

               使用方法和弃用函数的方法一样.

 

5. __attribute__((section("section-name"))): 这个是我在前文中说过的.

 

6. __attribute__((packed)): 使变量或者是结构体按照最小的对齐方式,对于变量是1byte对齐,对于字段,也就是field指bit对齐.

            这个会放到后面和前面的aligned一起作为字节对齐的讨论内容.

 

7.__attribute__((weak)) : 这个很搞了,官网上的手册只是丢了一个链接 那就是去参考Function Attribute中weak attribute的用法.所以我也就不多说什么了.

 

 

二、Type Attribute

1.__attribute__((aligned(ALIGNMENT))) : 字节对齐,和前面的用法差不多,注意使用aligned attribute使变量或者是结构做字节对齐的时候,对齐后只会增大或者不变.

     

struct S { short f[3]; }  __attribute__((aligned(8)));

typedef int more_aligned_int __attribute__((aligned(8)));

 

如上面所示, struct  S 指定了对齐的方式是8byte. f[3]总共是6byte.而由于指定了字节对齐操作数是8,所以整个S结构体就是8byte.

 

2.__attribute__((packed)): 前面已经介绍过了 packed attribute. 和前面的aligned不同的是,packed采用的是紧凑型的字节对齐方式,所以最后是会按照最小对齐方式执行.

struct unpacked_struct
{
         char c;
         int     i;
};


struct __attribute__(( packed )) packed_struct
{
          char c;
          int     i;
          struct unpacked_struct us;
};

 

 在上面的示例代码中,我们可以看到,在指定了packed对齐方式的struct packed_struct中有一个没有指定对齐方式的struct unpacked_struct对象。

 尽管我们对结构体packed_struct进行了packed方式的对齐,但是不能对其成员us进行指定字节对齐. 这点是需要注意的,所以如果需要对packed_struct结构进行packed完全紧凑对齐,

 则需要对unpacked_struct进行packed方式紧凑对齐.

 

 

 

 OK,把上午剩下的任务补上了...

 

 

 

 

 

抱歉!评论已关闭.