首页 > 解决方案 > 结构是声明或定义还是内核源代码中的某种类型的面向对象行为

问题描述

在 linux 内核源代码的 r8169_main.c 中有一个这样的结构

#define KBUILD_MODNAME "foo"

static struct pci_driver rtl8169_pci_driver = {
    .name       = KBUILD_MODNAME,
    .id_table   = rtl8169_pci_tbl,
    .probe      = rtl_init_one,
    .remove     = rtl_remove_one,
    .shutdown   = rtl_shutdown,
    .driver.pm  = pm_ptr(&rtl8169_pm_ops),
};

我喜欢在第一个成员 .name 中,但没有指定数据类型,并且.之前有它叫什么name.name = KBUILD_MODNAME,这个名称成员是否在其他地方定义了这个静态结构的含义我以前没有见过这种类型的结构。谁能告诉这是什么,甚至在结构声明中分配了一个值???

我也可以创建这种结构的数组吗?

标签: clinuxlinux-kernel

解决方案


这叫什么。

name是结构的成员struct pci_driver

这种初始化形式称为指定初始化。零件.name = something代号

此名称成员是否在其他地方定义

是的,在include/linux/pci.h中。

这个静态结构意味着什么我以前没有见过这种类型的结构

该行定义rtl8169_pci_driver了一个类型为 的变量struct pci_driverstatic关键字修改变量的生命周期——这意味着变量在程序的整个持续时间内都有效。

static struct pci_driver rtl8169_pci_driver = {...}
                                            ^^^^^^^ - initialization
                         ^^^^^^^^^^^^^^^^^          - variable name
       ^^^^^^^^^^^^^^^^                             - variable type
^^^^^                                               - storage specifier
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^          - variable declaration
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - variable definition

研究https://en.cppreference.com/w/c/language/declarations https://en.cppreference.com/w/c/language/struct_initialization https://en.cppreference.com/w/c/language /storage_duration

我也可以创建这种结构的数组吗?

您可以创建struct pci_drivers 的数组。

static struct pci_driver example_array[20] = {
   { .name = initilization_for_first_element, ... },
   { .name = initilization_for_second_element, ... },
   ... etc.
};

推荐阅读