[英]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 系统的设备详细信息(块和字符设备,保存在bdevsw
和cdevsw
)。
作为一个自动生成的文件,拆分数据类型的声明(在不同的系统中是一致的)和数组的定义(每个系统都会改变)是有意义的。 在该文件状态的顶部的意见,它和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.