结构体特定变量的赋值

1950阅读 0评论2015-02-26 abin9630
分类:LINUX

在查看 Kernel相关的代码时候,经常会看到结构体中,使用点开头的变量的赋值方式,类似:

点击(此处)折叠或打开

  1. static inline int ip_route_connect(struct rtable **rp, u32 dst,
  2.                    u32 src, u32 tos, int oif, u8 protocol,
  3.                    u16 sport, u16 dport, struct sock *sk)
  4. {
  5.     struct flowi fl = { .oif = oif,
  6.                 .nl_u = { .ip4_u = { .daddr = dst,
  7.                          .saddr = src,
  8.                          .tos = tos } },
  9.                 .proto = protocol,
  10.                 .uli_u = { .ports =
  11.                        { .sport = sport,
  12.                      .dport = dport } } };

  13.     int err;
  14. ...
  15. }

对于类似以点开头的结构体成员变量的赋值方式,可以实现比较自由的、对特定某些变量的赋值

根据网上相关说法,该功能是 GNU的扩展

在 Linux中,可以如下来进行使用,来实现对结构体中特定变量的值进行设定:

点击(此处)折叠或打开

  1. struct {
  2.     char a[4], b;
  3. }
  4. gStructA[] = {[0].a[0] = 1, [0].a[2] = 3, [1].a = {10, 11}, [1].b = 22};

  5. struct {
  6.     char a, b, c, d;
  7. }
  8. gStructB = {.a = 11, .c = 23, 32, .b = 18};

  9. int
  10. main(void)
  11. {
  12.     char *pInt = (char *)gStructA;
  13.     int num = 0;
  14.     printf("pInt: %p, sizeof(gStructA): %d\n", pInt, sizeof(gStructA));
  15.     for(num = 0; num < sizeof(gStructA); num++)
  16.     {
  17.         printf("%d ", pInt[num]);
  18.     }

  19.     pInt = (char *)&gStructB;
  20.     printf("\npInt: %p, sizeof(gStructB): %d\n", pInt, sizeof(gStructB));
  21.     for(num = 0; num < sizeof(gStructB); num++)
  22.     {
  23.         printf("%d ", pInt[num]);
  24.     }

  25.     return 0;
  26. }

使用gcc编译后,输出为:

点击(此处)折叠或打开

  1. [martin@REV]$ ./a.out
  2. pInt: 0xbfa985d6, sizeof(gStructA): 10
  3. 1 0 3 0 0 10 11 0 0 22
  4. pInt: 0xbfa985d2, sizeof(gStructB): 4
  5. 11 18 23 32 [martin@REV]$
  6. [martin@REV]$

以上的数组元素初始化中,除使用了带“."的方式外,其他的和正常的数组初始化是一样的:
实现了对于有数组的结构体变量的初始化赋值,对于未进行显式初始化的数组元素,默认初始化为0

--------------------------REF------------------------------


http://blog.chinaunix.net/uid-21317725-id-1828031.html
上一篇:Thundbird签名设置
下一篇:#, ##, args...以及__VAR_ARGS__宏定义解析