当前.c文件引用其它.c文件声明的结构体的限制
环境说明
- 语言: GNU C
- 版本: linux-4.10.15
- 文件 :
- /linux-4.10.15/drivers/base/map.c
- /linux-4.10.15/include/linux/kobj_map.h
- /linux-4.10.15/include/fs/char_dev.c
前言
c语言的老手都知道,想要在当前.c文件引用其它.c文件定义的变量、函数等,只需要包含相应的.h文件就行,并在.h文件中进行声明就行。
结构体也是一样,但是结构体一般都是在.h中进行声明,当前.c文件需要使用这个结构体,只需包含.h文件就行。但是如果结构体是在其它.c中声明,当前.c文件需要引用怎么解决。
源码
1.struct kobj_map 结构体在map.c文件中声明
2.相应的kobj_map.h 只是声明了 struct kobj_map;
3.char_dev.c中包含了kobj_map.h,并且引用了 kobj_map结构体。
4.这种方法确实可行,因为当前char_dev.c 文件创建的是一个指针变量,并没有对指针指向的内容分配内存。如果创建的是一个struct kobj_map变量,就会报错,因为kobj_map.h文件声明struct kobj_map; 是一个空的,创建变量分配内存的时候发现结构体没有指定大小。
结论
linux 源码既然用了这种方式,肯定有它的道理,可能是一些安全性的考虑,但是用了,会用一些限制。当前.c文件只能创建结构体的指针变量,操作结构体中的成员变量也只能是相应的函数中进行。