【发布时间】:2020-09-03 01:48:20
【问题描述】:
unix 6th 源代码。很老了。
conf.h
struct bdevsw {
int (*d_open)();
int (*d_close)();
int (*d_strategy)();
int *d_tab;
} bdevsw[];
conf.c
int (*bdevsw[])(){
&nulldev, &nulldev, &rkstrategy, &rktab,
&nodev, &nodev, &nodev, 0,
0
}
我的问题是为什么不初始化,
bdevsw[] = {......}
【问题讨论】:
-
UnixV6 于 1975 年推出,long 甚至早于 C89。 C 甚至 有 你当时展示的类型的结构初始化吗? :-)
-
乍一看,初始化stmt中的第二个括号使它看起来像一个让我感到困惑的函数。
-
如果这是 K&R 风格的 C,与现代 C 相比,它会非常看起来很古怪。
-
V7 对此进行了一些清理;它有
struct bdevsw bdevsw[] = { ... } -
关于:
struct bdevsw { int (*d_open)(); int (*d_close)(); int (*d_strategy)(); int *d_tab; } bdevsw[];不要将数据声明放在头文件中(将数据声明放在 *.c 源文件中,仅将结构类型定义放在头文件中)否则,当此头文件包含在多个源文件中的数据将有多个实例。此外,这声明了一个没有长度值的数组,这在 C 中是不允许的。编译器最多会定义一个指向结构类型的点。