免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2285 | 回复: 9
打印 上一主题 下一主题

请教一个数组定义的语法问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-01 16:17 |只看该作者 |倒序浏览
在 iptables 的 libiptc/libiptc.c 中,有下午一段定义:



  1.      51 static const char *hooknames[]
  2.      52 = { [HOOK_PRE_ROUTING]  "PREROUTING",
  3.      53     [HOOK_LOCAL_IN]     "INPUT",
  4.      54     [HOOK_FORWARD]      "FORWARD",
  5.      55     [HOOK_LOCAL_OUT]    "OUTPUT",
  6.      56     [HOOK_POST_ROUTING] "POSTROUTING",
  7.      57 #ifdef HOOK_DROPPING
  8.      58     [HOOK_DROPPING] "DROPPING"
  9.      59 #endif
  10.      60 };
复制代码


据说这段代码是定义netfitler的钩子的,但是究竟是怎么样定义的,这段代码看不明白,还请各位指点一二。
谢谢。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2006-03-01 16:22 |只看该作者
在定义数组 hooknames 的同时对其元素进行初始化.

论坛徽章:
0
3 [报告]
发表于 2006-03-02 11:12 |只看该作者
谢谢2楼。

[HOOK_PRE_ROUTING]  这个是什么意思呢?

论坛徽章:
0
4 [报告]
发表于 2006-03-02 13:16 |只看该作者

  1. #include <stdio.h>

  2. int
  3. main ()
  4. {
  5.         char *a[]=
  6.         {
  7.                 [4] "foo",
  8.                 [2] "bar",
  9.                 [99] "foobar"
  10.         };

  11.         printf("%d\n", sizeof(a)/sizeof(a[0]));
  12.         puts (a[2]);
  13.         puts (a[4]);
  14.         puts (a[99]);

  15. }
复制代码


  1. 100
  2. bar
  3. foo
  4. foobar
复制代码

论坛徽章:
0
5 [报告]
发表于 2006-03-02 13:20 |只看该作者
原帖由 wangrujun 于 2006-3-2 11:12 发表
谢谢2楼。

[HOOK_PRE_ROUTING]  这个是什么意思呢?


HOOK_PRE_ROUTING 对应一个常数。[HOOK_PRE_ROUTING] xxx 在数组初始化中指定该下标对对应的元素为 xxx。

这种写法是 gcc 的一个扩展。

[ 本帖最后由 win_hate 于 2006-3-2 13:21 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-03-02 13:27 |只看该作者
原帖由 win_hate 于 2006年3月2日 13:16 发表
[code]
#include <stdio.h>

int
main ()
{
        char *a[]=
        {
                [4] "foo",
                [2] "bar",
                [99] "foobar"
        };

        printf("%d\n", sizeof(a)/sizeof(a[ ...



又学到一点了.真是感谢.不然我还是看不懂的.

论坛徽章:
0
7 [报告]
发表于 2006-03-02 13:59 |只看该作者
学习学习,又学到了点,谢谢!~~

论坛徽章:
0
8 [报告]
发表于 2006-03-03 14:14 |只看该作者
原帖由 win_hate 于 2006-3-2 13:16 发表
[code]
#include <stdio.h>

int
main ()
{
        char *a[]=
        {
                [4] "foo",
                [2] "bar",
                [99] "foobar"
        };

        printf("%d\n", sizeof(a)/sizeof(a[ ...



谢谢版主。

这样的话,没有定义的部分,是不是就是空洞?其中的内容应该是随机的,是这样吗?

谢谢版主。

论坛徽章:
0
9 [报告]
发表于 2006-03-03 15:09 |只看该作者
不必客气,我查了手册,这个写法是 C99 支持的。gcc 的手册说:

5.21 Designated Initializers

Standard C89 requires the elements of an initializer to appear in a fixed order, the same as the order of the elements in the array or structure being initialized.

In ISO C99 you can give the elements in any order, specifying the array indices or structure field names they apply to, and GNU C allows this as an extension in C89 mode as well. This extension is not implemented in GNU C++.

To specify an array index, write `[index] =' before the element value. For example,

     int a[6] = { [4] = 29, [2] = 15 };

is equivalent to

     int a[6] = { 0, 0, 15, 0, 29, 0 };

The index values must be constant expressions, even if the array being initialized is automatic.

......


我测试了一下,结果跟上面所说是一致的,即未指定的分量值为 0.

论坛徽章:
0
10 [报告]
发表于 2006-03-03 15:25 |只看该作者
原帖由 win_hate 于 2006-3-3 15:09 发表
不必客气,我查了手册,这个写法是 C99 支持的。gcc 的手册说:



我测试了一下,结果跟上面所说是一致的,即未指定的分量值为 0.

虽然我肯定不会用这种方法去初始化数组,但是对于版主的知识面,还是不得不赞!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP