C语言文件结构
1.前言
在工作中时长用的C,但总感觉缺少了什么,在学习一些视频时看到有推荐《高质量C++/C编程指南》,虽是培训资料,但深受感悟,想将其中的东西自己过一遍,并将其中的一些知识拓展,遂有此专栏
2.正文——文件结构
每个C语言程序通常分为两个文件,一个是.h为后缀,一个是.c为后缀。
.h称为头文件,用于保护程序的声明(declaration )
.c称为定义( definition )文件,用于保存程序的实现(C++是.cpp 为后缀)
2.1版权和版本的声明
版权和版本的声明位于头文件和定义文件的开头,主要内容有:
(1)文件名称,摘要
(2)版本,时间,作者
(3)版权,历史信息
2.2头文件的结构
头文件由三部分内容组成:
(1)头文件开头处的版权和版本声明。
(2)预处理块。
(3)函数和类结构声明等。
头文件的一些定义有以下规则:
<1>为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。
<2> 用 #include < filename.h> 格式来引用标准库的头文件(使用时编译器会从标准库目录开始搜索)。
<3>用 #include “filename.h” 格式来引用非标准库的头文件(编译器会从用户的工作目录开始搜索)。
小建议:
1.头文件中只存放“声明”而不存放“定义”
在 C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。建议将成员函数的定义与声明分开,不论该函数体有多么小。
2.不提倡使用全局变量,尽量不要在头文件中出现象 extern int value 这类声明。
假设头文件名称为Test.h,头文件的结构见下图
定义文件有三部分内容:
(1)定义文件开头处的版权和版本声明(参见 2.1图示 )。
(2) 对一些头文件的引用。
(3) 程序的实现体(包括数据和代码)。
假设定义文件的名称为 Test.cpp, 定义文件的结构见下图
2.3 头文件的理解
在学习的早期,我们可以使用一个源文件来实现我们简单的学习,但在后期不断提高以及大项目中,我们是不可能把所有源码写在一个源文件中,需要很多个源文件,然后编译为一个exe进行输出,如果在每个源文件都要重复写出所有外部函数、类的完整声明,显得有点“傻”,头文件的应用让我们在写代码时更方便,ifndef/define/endif的结构可以防止一个的东西被反复定义,我们当然不可能写出
#include "Test.h"
#include "Test.h"
但却不能确保已经存在于Test.h的某个函数不被再次定义
2.4头文件的作用
防止重复定义或者便利已经在理解中有所说明,还有一个在工作中更多有所体会的作用,
头文件只放声明,而定义(实现)放在.c/.cpp中。这种分离带来的直接好处是:
当源代码不便或不准向用户公布时,只需提供头文件 + 二进制库(
.lib/.a/.so等)。用户通过头文件中的接口声明调用库功能,无需关心内部实现细节,保护了知识产权。同时,这种方式允许分别编译与链接,提高大型项目的构建效率
