首先翻看<c primer plus> 12.1.1-12.1.11节, 弄懂相应术语和规则
以及略懂C的预处理编译链接的全过程
然后个人总结理解多文件:
- C/C++中需要先声明后使用
- #include 预处理, 实际上只是把#include的文件复制到当前文件中
- .h文件没有产生任何(与后缀名相关的)特殊处理, 而且是可选的 (不是必要的), 实际上该后缀和任何文本文件没啥区别
文件a要使用文件b中实现的变量/函数:
1. 文件a中有相应函数的声明 (extern引用式声明, 由于函数声明默认是extern的, 所以不用相应关键字)
2. 链接时会在所有obj文件中寻找变量的定义 / 函数的实现(定义)
在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)
所以, 头文件只是将文件a中的声明和文件b中的声明统一组织 (比方说文件b实现时需用到文件c, 但其实文件a是无需引用文件c的, 此时该#include还是写在文件b中) 上述文件均指.c文件
这就是为啥要将函数/结构体的声明写到头文件中 分别在实现的文件(文件b) 和 使用的文件(文件a)中分别#include了
其次, 外部链接的静态变量不应该写在头文件中 (会因为上述习惯多次定义), 而应该在使用时extern声明.
所以, 简单的多文件可以直接用在使用的文件中直接 外部声明+gcc a.c b.c -o test 的方式来产生执行文件test
ref: 看完以下你就会回忆起来所有的想法了
1. https://www.zhihu.com/question/280665935/answer/649503865
2. https://zhuanlan.zhihu.com/p/113526840
3. https://www.zhihu.com/question/40972250/answer/89031476
4. https://www.zhihu.com/question/58547318/answer/157444718
附加阅读:
1. https://www.zhihu.com/question/370130782/answer/1004583903