http://stackoverflow.com/questions/330793/how-to-initialize-a-struct-in-accordance-with-c-programming-language-standards
在内核中fs/ext3/indoe.c
中,一个struct初始化格式个这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
static const struct address_space_operations ext3_writeback_aops = { .readpage = ext3_readpage, .readpages = ext3_readpages, .writepage = ext3_writeback_writepage, .write_begin = ext3_write_begin, .write_end = ext3_writeback_write_end, .bmap = ext3_bmap, .invalidatepage = ext3_invalidatepage, .releasepage = ext3_releasepage, .direct_IO = ext3_direct_IO, .migratepage = buffer_migrate_page, .is_partially_uptodate = block_is_partially_uptodate, .error_remove_page = generic_error_remove_page, }; |
我以前没见过这种形式,于是查了一下,原来这是属于C99的“新”特性。
初始化
对于最初(C89)一般形式的struct初始化,需要在大括号中按照成员顺序初始化,和初始化数组很类似;而C99支持乱序初始化,只要给出初始化的变量名,并且在前面加点,后边加等号即可。下面举例和c语言中一般形式的初始化结构体对比:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* 结构体定义 */ struct People { char * name; int age; int sex; }; /* 形式1(C89,需要成员顺序初始化) */ struct People zjc= {"jayceezhang", 22, 1}; /* 形式2(C99) */ struct People zjc2= { .age = 22, .name = "jayceezhang", .sex = 1 }; |
赋值
对于赋值,C99支持的方式更多样灵活,举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* 形式1(C89): 很好理解,就是分别赋值 */ zjc.name = "zhangjc"; zjc.age = 22; /* * 形式2(C99): 可以理解为创建了一个临时struct People变量赋给了zjc,和初始化一 * 个道理一样,可以顺序或者点名赋值,但是注意如果没被赋值变量会被覆盖成不明确的值, * 而不会保留原有的值,具体覆盖成什么值应该取决于编译器实现(比如gcc可能是0),所 * 以个人感觉方式的赋值个人感觉更像是“重新初始化”而已。 */ zjc = (struct People){"zhangjc", 22, 1}; zjc = (struct People){.age = 23, .name = "jcccc", .sex = 1}; |