attribute.c: In function `test': attribute.c:7: warning: format argument is not a pointer (arg 2) attribute.c:9: warning: format argument is not a pointer (arg 2) attribute.c:9: warning: too few arguments for format
变量属性(Variable Attribute) 该属性规定变量或结构体成员的最小的对齐格式,以字节为单位。例如: int x __attribute__ ((aligned (16))) = 0; 编译器将以16字节(注意是字节byte不是位bit)对齐的方式分配一个变量。也可以对结构体成员变量设置该属性,例如,创建一个双字对齐的int对,可以这么写: struct foo { int x[2] __attribute__ ((aligned (8))); }; 如上所述,你可以手动指定对齐的格式,同样,你也可以使用默认的对齐方式。如果aligned后面不紧跟一个指定的数字值,那么编译器将依据你的目标机器情况使用最大最有益的对齐方式。例如: short array[3] __attribute__ ((aligned)); 选择针对目标机器最大的对齐方式,可以提高拷贝操作的效率。 aligned属性使被设置的对象占用更多的空间,相反的,使用packed可以减小对象占用的空间。 需要注意的是,attribute属性的效力与你的连接器也有关,如果你的连接器最大只支持16字节对齐,那么你此时定义32字节对齐也是无济于事的。
packed 使用该属性对struct或者union类型进行定义,设定其类型的每一个变量的内存约束。当用在enum类型定义时,暗示了应该使用最小完整的类型(it indicates that the smallest integral type should be used)。 下面的例子中,my-packed-struct类型的变量数组中的值将会紧紧的靠在一起,但内部的成员变量s不会被“pack”,如果希望内部的成员变量也被packed的话,my-unpacked-struct也需要使用packed进行相应的约束。 struct my_unpacked_struct { char c; int i; };