码海拾遗

但行好事,莫问前程

导航

指定类型属性

当你定义结构体和共用体类型时,关键字attribute允许你为这些类型指定特殊的属性。这个关键字后面跟随着包含双parentheses的指定类型。四中属性常被定义为:对齐(aligned),封装(packed)型,透明共用体型(transparent-union)和未使用。另外的属性则被定义为函数(看 段函数属性的声明)和变量(看 段指定变量属性)。

你可以指定这些属性在关键字之前或后面。这就使你能在头文件应用这种属性而不必声明 可能有同样名字的宏 例如:你能用_aligned__ instead of aligned.

你可以在括号中放入枚举的定义或声明, 结构或共用类型的定义和集装属性,括号后指定其属性。

你也能在枚举,结构或共用间指定属性的tag和名字而不是在)后。

看 属性语法,对于准确使用语法属性


  • aligned 这种属性指定一个最小的队列(按位算)为变量指定类型。例如,如下的声明:
     
    struct S { short f[3]; } __attribute__ ((aligned (8)));
    typedef int more_aligned_int __attribute__ ((aligned (8)));
    强制使编译器确定每个类型为S的结构体变量或者更多的组合整型,将被分配和匹配为至少8位。在可精简效能结构中,当复制一个结构体S变量到另外一个时。拥有所有的结构体S 对齐8位的变量使编译器能使用lddstd,因此可以提高运行效率。{注意,任何给定的结构体或共同体类型的对齐是ISO C标准所需的,至少是正在谈论的结构体或共同体类型所有成员对齐的最小公倍数的一个完全的倍数。这就意为着你能有效的教正附属于aligen对于结构体和共用体队列成员的属性。但是以上例子中插入的注释更加明显,直观和可读对于编译者来校正一个完全的结构体或共用体类型组合。封装(packed)这种属性接近于枚举,结构或者共用类型的定义,指定一个所需最小的内存用来代办这种类型。为结构体和共用体指定这种属性等效于为他们的每个成员指定集装的的属性。指定“短-枚举”标志等同于指定封装的属性在所有的枚举定义。你也可以仅仅在括号后面指定这种属性,而不是为他定义类型的声明,除非声明也包括枚举的定义。transparent_union这种属性基于共用体的定义,表明一些函数的参数使用共用类型会被看作调用函数的一种特殊途径。首 先,参数与同透明共用体类型保持一致,能成为任何类型的共用体;不需要转换. 加入共用体包含指针类型,一致的参数能成为一个空指针常量或空指针表达式;加入共用体包含空指针,一致参数能成为指针表达式。加入共用体成员类型是之至, 类型修饰符就像指定,就如一般的指针的转换一样。第二,参数被传给函数用到的调用转换(透明共用体的第一个成员,不能调用转换共用体本身。所有的成员必须拥有相同的机器代理;这就使参数传输能进行了。透明共用体拥有多种接口库函数来处理兼容性问题。例如,假定等待函数必须要接受一种整型来遵从Posix,或者一个共用wait函数要适应4.1BSD接口。记入wait函数的参数是空型,wait函数将接受各种型的参数,但是它也能接受另外的指针型和这个将能使参数类型的检测降低效用。而为"sys/wait.h"定义的接口如下:
     
    typedef union
    {
    int *__ip;
    union wait *__up;
    } wait_status_ptr_t __attribute__ ((__transparent_union__));
    pid_t wait (wait_status_ptr_t);
    这种接口允许整形或共用体等待参数的传输,用整型的调用转换,这个程序能调用参数和类型:
     
    int w1 () { int w; return wait (&w); }
    int w2 () { union wait w; return wait (&w); }
    在这个接口下,wait的执行将是这样:
     
    pid_t wait (wait_status_ptr_t p)
    {
    return waitpid (-1, p.__ip, 0);
    }
    未用(unused)当应用一种类型(包括共用体和结构体),这个属性意为着这种变量类型可能出席那不能使用的,GCC讲不能产生警告对这些类型的变量,几十变量什么作用都没,这还经常能导致锁或线程的种类(通常被定义但不引用,但是包含构建与消毁都存在非平凡簿记功能.)

posted on 2017-03-25 18:03  widrin  阅读(284)  评论(0编辑  收藏  举报