常见内容
源文件的头部一般都会有#include
指令来包含头文件,头文件的内容一般就是
- #define语句
- extern声明
- 函数原型声明
#include
和#define
都是C的预处理指令,#include
就是把文件中的所有内容粘贴到源文件中,仅此而已!
(一般)格式
头文件的编写一般遵循如下格式
#ifndef _MYLIB_H_
#define _MYLIB_H_
/*文件的内容放在这里,如*/
int a;
typedef struct _node{
int value;
struct _node *next;
}Node;
#define PI 3.14
#endif
这样写的目的是为了防止重复导入,因为预处理器在处理ifndef
指令的时候,如果_MYLIB_H_
被定义过了,就会直接跳转到#endif
处,中间的内容在真正编译的时候不会被包括进去。_MYLIB_H_
可以改成任何名字,不过最好按照规范:所有字母大写,.改成_。
刚开始我一直以为_MYLIB_H_
被定义为下面的所有语句,然后就很纳闷,这个define怎么和宏定义的define不太一样,其实在这里_MYLIB_H_
就是被定义成了一个空的东西,有定义但是什么值都没有。然后如果又被引入一次,预处理器就会跳到#endif
去,使得头文件的内容不被重复包含(虽然应该是被重复粘贴了)
一些规范
尽管条件包含可以避免包含多个同一文件,用户就不必考虑头文件之间的依赖关系,但是不同源文件的链接是在最后一步进行的,而预处理是在第一步进行的,所以如果头文件中有变量的定义而且被多个文件包含,在链接的时候就会报重复定义的错误,所以,一个好的规范就是:
头文件中不要有函数或者变量的定义!