這幾天看Linux的內核源碼,突然看到init_pid_ns這個結構體變量的賦值特別奇怪。
struct pid_namespace init_pid_ns = {
.kref = {
.refcount = ATOMIC_INIT(2),
},
.pidmap = {
[ 0 ... PIDMAP_ENTRIES-1] = { ATOMIC_INIT(BITS_PER_PAGE), NULL }
},
.last_pid = 0,
.level = 0,
.child_reaper = &init_task,
};
請注意上面代碼的.pidmap這個結構體數組的賦值形式。
[ 0 ... PIDMAP_ENTRIES-1]
直接拿索引來賦值,而且直接寫出了索引的范圍。有點python的味道。
只是記得C語言的函數的可變參數是用的...的方式。沒想過結構體也有這種操作方式。
比較感興趣,自己寫了一小段類似的代碼。
#include <stdio.h>
struct pid{
int val;
void *fn;
};
struct str{
int val;
struct pid id[10];
};
struct str init_str = {
.val = 1,
.id = {
[ 0 ... 9] = {2, NULL}
},
};
int main(void){
int i;
for(i = 0; i < 10; i++)
printf("init_str.id[%d].val = %d\n", i, init_str.id[i].val);
return 0;
}
編譯後測試。結果的確是這樣。
如果要對結構體數組進行操作,這種方式可以試試
摘自 wfing