结构声明问题

时间:2010-11-14 03:14:14

标签: c data-structures

http://lxr.free-electrons.com/source/drivers/net/8139too.c#L498 在上面的链接 我没有得到的是 结构

static const struct {
        const char *name;
        u32 version; /* from RTL8139C/RTL8139D docs */
        u32 flags;
} rtl_chip_info[] = {
        { "RTL-8139",
          HW_REVID(1, 0, 0, 0, 0, 0, 0),
          HasHltClk,
        },

扩展到

static const struct {
        const char *name;
        u32 version; /* from RTL8139C/RTL8139D docs */
        u32 flags;
} rtl_chip_info[] = {
        { "RTL-8139",
**(b30, b29, b28, b27, b26, b23, b22)
        (b30<<30 | b29<<29 | b28<<28 | b27<<27 | b26<<26 | b23<<23 | b22<<22)
(1, 0, 0, 0, 0, 0, 0),**
          HasHltClk,
        },

我不理解结构声明的上述类型(第2)。

2 个答案:

答案 0 :(得分:3)

(b30, b29, b28, b27, b26, b23, b22)实际上并没有进入代码 - 它们是HW_REVID宏的参数。换句话说,

HW_REVID(1, 0, 0, 0, 0, 0, 0),

变成

(1<<30 | 0<<29 | 0<<28 | 0<<27 | 0<<26 | 0<<23 | 0<<22)

因为b30等替换了1, 0,等等(注意通过替换我的意思是字面上的复制和粘贴)等等。所以说完所有内容后看起来像:

static const struct {
    const char *name;
    u32 version; /* from RTL8139C/RTL8139D docs */
    u32 flags;
} rtl_chip_info[] = {
    { "RTL-8139",
      (1<<30 | 0<<29 | 0<<28 | 0<<27 | 0<<26 | 0<<23 | 0<<22), /* originally HW_REVID(1, 0, 0, 0, 0, 0, 0), */
      HasHltClk,
    }

我不知道你正在使用什么编译器,但是如果你使用gcc,你可以通过-E开关只做预处理(替换#defines和宏等等)所以你可以看到它正在编译的代码。

答案 1 :(得分:1)

HW_REVID只是在各个位位置30到22中设置1的宏。它被定义为:

#define HW_REVID(b30, b29, b28, b27, b26, b23, b22) \
        (b30<<30 | b29<<29 | b28<<28 | b27<<27 | b26<<26 | b23<<23 | b22<<22)

当被称为HW_REVID(1,0,0,0,0,0,0)时,它会扩展为:

    (1<<30 | 0<<29 | 0<<28 | 0<<27 | 0<<26 | 0<<23 | 0<<22)

将剩余的1 30个位置(进入位30)初始化为32位版本字段为0x40000000。