c头文件的作用是什么,和.c文件是怎么联系的,该怎么样编写头文件呢?这些问题我一直没搞明白,在阅读uCOS-II(邵贝贝)“全局变量”部分有些疑惑,今天终于搞清楚了头文件的一些基础知识,特地分享一下。
<一>头文件的作用和内容
当写一个小程序的时候,可以将所有代码放在一个.c文件中。当写一个大项目是,由于代码量很多,就需要将代码分开,就出现了多个.h和.c文件。我认为.h文件的主要作用是将所有.c文件连接起来,即使.c文件的内容互相调用成为可能。先看下最简单的代码:
//main.c
1 int a; 2 int main() 3 { 4 a = 0; 5 return 0; 6 }
这段代码没有头文件,依旧可以执行。讲到这,不得不提一下编译器编译的步骤:
1.预处理:预处理过程实质上是处理“#”,将#include包含的头文件直接拷贝到.c文件当中;将#define定义的宏进行替换,同时将代码中没用的注释部分删除等。(后面编译的步骤是编译,汇编,链接)
那么.h中的文件内容到底是什么呢?最基本的内容:extern变量、(extern)函数的声明,宏定义;网上说一般不提倡将变量定义,函数定义放在.h文件中。这种说法我认为是错误的,不是不提倡,就是不能。在实际工作中这会产生极大的错误。先将正确的内容:
首先变量声明和函数声明是不同的。例如:extern void f(); 等价与void f(); , extern int f;不等价于int f;(extern int f ; 是声明变量f,int f ; 是定义变量f),所以函数声明两种写法都行,声明可以有多个,定义只能有一个。
上面那个最简单的程序,也可写.h+.c的形式:
//test.h
1 #ifndef TEST_H 2 #define TEST_H 3 extern int a; 4 #endif
//test.c
1 #include "test.h" 2 int a;
//main.c
1 #include "test.h" 2 int main() 3 { 4 a = 0; 5 return 0; 6 }
预处理完成后的代码:
//预处理后main.c
1 extern int a; 2 int main() 3 { 4 a = 0; 5 return 0; 6 }
将到这,就需要知道extern 的作用了:extern用在变量或函数的声明前,用来说明“此变量/函数是在别处定义的。找到了定义,和直接定义是一样的吧。
<二>头文件和.c文件是怎么联系的
通过extern联系。
<三>怎么样编写头文件
网上的教程有很多,写头文件的基本原则:1.不要将定义放在头文件,容易造成重复定义的错误。
2.只能有一个定义,可以有多个声明。
3.xxx.h写出xxx.txt也能编译通过。
浙公网安备 33010602011771号