为何初始化struct scsi_transport_template为NULL需要四层大括号?
关于scsi_transport_template四层大括号初始化的问题解答
你看到的四层大括号是匹配结构体嵌套层级的显式初始化写法,并非C语法强制要求,只是为了明确初始化值对应的成员路径,提升代码可读性。
层级匹配逻辑
你给出的代码里没有列出struct transport_container的定义,这个是Linux SCSI子系统的标准结构体,它内部还有两层嵌套,加上最外层的scsi_transport_template本身,正好对应四层大括号:
- 最外层(第一层)大括号:对应整个
struct scsi_transport_template变量的初始化范围 - 第二层大括号:匹配
scsi_transport_template的第一个成员struct transport_container host_attrs的初始化范围 - 第三层大括号:匹配
transport_container的第一个成员struct attribute_container的初始化范围 - 最内层(第四层)大括号:匹配
attribute_container的第一个成员(内核标准定义里是双向链表头struct list_head)的初始化范围,给链表头的第一个指针成员赋值为NULL
等价简化写法
根据C语言的聚合初始化规则,只要初始化列表给出了第一个成员的赋值,剩余所有未显式声明的成员都会自动初始化为0值(指针类成员自动为NULL,数值类成员自动为0)。所以以下几种写法的效果完全相同,都能把整个blank_transport_template的所有成员清零:
// 原代码的四层显式写法 struct scsi_transport_template blank_transport_template = { { { { NULL, }, }, }, }; // 最简写法 struct scsi_transport_template blank_transport_template = {0};
原代码写全四层大括号,只是为了让维护代码的开发者不用翻结构体定义就能明确初始化的嵌套路径,属于可读性优化的写法。
内容的提问来源于stack exchange,提问作者qbai
相关产品推荐
相关产品推荐

