繁体   English   中英

C 结构体数组的初始化

[英]initialization of C structure array

unix 6 源代码。 很老。

配置文件

 struct bdevsw {
   int (*d_open)();
   int (*d_close)();
   int (*d_strategy)();
   int *d_tab;
 } bdevsw[];

配置文件

 int (*bdevsw[])(){
    &nulldev, &nulldev, &rkstrategy, &rktab,
    &nodev, &nodev, &nodev, 0,
    0
 }

我的问题为什么不初始化只是读取,

 bdevsw[] = {......}

为这个答案收集的所有信息都来自我信任的狮子会评论书副本。 对于非常早期的 UNIX 代码,这是一个很好的资源。

如果您将声明的这种怪异内容注入cdecl ,您将看到其目的是:

bdevsw声明为指向返回int函数的指针数组。

因此,它根本不是代码(a) ,而是函数的数组定义,每个设备一个,与您的建议几乎相同。

它不在头文件中的原因可能是以下原因。


首先, conf.c文件实际上是由mkconf 自动生成的,因为该文件包含给定 UNIX 系统的设备详细信息(块和字符设备,保存在bdevswcdevsw )。

作为一个自动生成的文件,拆分数据类型的声明(在不同的系统中是一致的)和数组的定义(每个系统都会改变)是有意义的。 在该文件状态的顶部的意见,它和low.s ,是结果mkconf


其次,有很多包含conf.h C 文件。 例如, bio.c (块 I/O)、 sys3.c (文件系统调用)、 fio.c (文件调用)和alloc.c (非常早的初始化以读取根超级块)。

因此,如果数组是在头文件中定义的(大概是static以防止双重定义),每个源文件基本上都会有它自己的副本,浪费宝贵的空间。 通过在conf.c定义它,每个人共享一个副本。


(a)你的评论是:

初始化 stmt 中的第二个括号使它看起来像一个函数

是可以理解的,在这种情况下,它确实代表了一个函数调用。 但仅限它的指针数组的功能,并没有实际功能的定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM