通过PCIe驱动程序时,我看到了这种类型的结构体初始化
static struct pci_device_id DWC_ETH_QOS_id[] = {
{ PCI_DEVICE(VENDOR_ID, DEVICE_ID), },
{ },
}
我也在设备树 of_device_id 的初始化程序中找到了类似的代码:
static const struct of_device_id rh850_match_table[] = {
{ .compatible = "renesas,rh850" },
{ }
};
为什么末尾有一个空的{}?
感谢您的帮助!
答案 0 :(得分:2)
ISO C语法要求初始化列表为非空,但是某些编译器(例如GCC)允许这样做。
这是该主题的discussion。
如果该对象为空(如果没有= {...}部分,则得到零值),结果的答案是“如果对象具有静态持续时间,则为是,否则为否”。
我个人使用我知道的值进行初始化,而不依赖于未定义的行为。它可能会限制代码的可移植性,但我怀疑在这种做法很普遍的社区(Linux驱动程序中默认的GCC是GCC)中,这不是一个问题。
答案 1 :(得分:2)
正如@underscore_d指出的那样,添加了 {} 作为哨兵元素,以便遍历这些数组的代码知道何时停止。它依赖于最后一个“空”前哨元素作为终止条件。
依赖于哨兵元素的代码:
struct of_device_id表: https://elixir.bootlin.com/linux/v4.14.76/source/drivers/of/base.c#L997
struct pci_device_id: https://elixir.bootlin.com/linux/v2.6.35/source/drivers/pci/pci-driver.c#L246