1、GunC允许零长度的数组,在定义变长对象的头结构时,这个特性非常有用,例如:
struct var_data
{
int ilen;
char str[0];
}
char str[0]仅仅意味着程序中通过var_data结构体实例的str[index]成员可以访问iLen之后的第index个地址,它并没有为str[]数组分配内存,因此sizeof(var_data)=sizeof(int),
2、标准 C要求数组或结构体的初始化值必须以固定的顺序出现,在GNU C 中,通过指定索引或结构体成员名,允许初始化值以任意顺序出现。指定数组索引的方法是在初始化值前添加“[INDEX] =”,当然也可以用“[FIRST … LAST] =”的形式指定一个范围。例如下面的代码定义一个数组,并把其中的所有元素赋值为0:
unsigned char data[MAX] = { [0 ... MAX-1] = 0 };
下面的代码借助结构体成员名初始化结构体:
struct file_operations ext2_file_operations =
{
llseek: generic_file_llseek,
read: generic_file_read,
write: generic_file_write,
ioctl: ext2_ioctl,
mmap: generic_file_mmap,
open: generic_file_open,
release: ext2_release_file,
fsync: ext2_sync_file,
};
但是,Linux 2.6 推荐类似的代码应该尽量采用标准C的方式,如下所示:
struct file_operations ext2_file_operations =
{
.llseek = generic_file_llseek,
.read = generic_file_read,
.write = generic_file_write,
.aio_read = generic_file_aio_read,
.aio_write = generic_file_aio_write,
.ioctl = ext2_ioctl,
.mmap = generic_file_mmap,
.open = generic_file_open,
.release = ext2_release_file,
.fsync = ext2_sync_file,
.readv = generic_file_readv,
.writev = generic_file_writev,
.sendfile = generic_file_sendfile,
};
3、aligned属性用于变量、结构体或联合体,指定变量、结构体或联合体的对界方式,以字节为单位,例如:
struct example_struct
{
char a;
int b;
long c;
} _ _attribute_ _((aligned(4)));
表示该结构类型的变量以4 字节对界。
packed属性作用于变量和类型,用于变量或结构体成员时表示使用最小可能的对界,用于枚举、结构体或联合体类型时表示该类型使用最小的内存。例如:
struct example_struct
{
char a;
int b;
long c _ _attribute_ _((packed));
};