.h头文件中,只能存在变量、函数、类的声明, 而不要放定义。即:
但是,这个规则是有三个例外的。
考虑一下,如果头文件中只包含声明语句的话,它被同一个.cpp文件包含再多次都没问题——因为声明语句的出现是不受限制的。
然而,上面讨论到的头文件中的三个例外也是头文件很常用的一个用处。
那么,一旦一个头文件中出现了上面三个例外中的任何一个,它再被一个.cpp包含多次的话,问题就大了。因为这三个例外中的语法元素虽然“可以定义在多个源文件中”,但是“在一个源文件中只能出现一次”。
设想一下,如果a.h中含有类A的定义,b.h中含有类B的定义,由于类B的定义依赖了类A,所以b.h中也#include了a.h。现在有一个源文件,它同时用到了类A和类B,于是程序员在这个源文件中既把 a.h包含进来了,也把b.h包含进来了。这时,问题就来了:类A的定义在这个源文件中出现了两次!于是整个程序就不能通过编译了。
你也许会认为这是程序 员的失误——他应该知道b.h包含了a.h——但事实上他不应该知道。
使用”#define”配合条件编译可以很好地解决这个问题。
头文件中的 #ifndef 是一个很关键的东西。
#ifndef的作用:防止多个源文件同时包含同一个头文件时产生的声明冲突。在一个头文件中,通过 #define 定义一个名字,并且通过条件编译 #ifndef...#endif
一般格式:
- #ifndef <标识>
- #define <标识>
- ...
- ...
- #endif
使得编译器可以根据这个名字是否被定义,再决定要不要继续编译该头文中后续的内容。
<标识> 在理论上来说可以是自由命名的,但每个头文件的这个<标识>都应该是唯一的。标识的命名规则一般是:
这个方法虽然简单,但是写头文件时一定记得写进去。
如:stdio.h:
- #ifndef _STDIO_H_
- #define _STDIO_H_
- ...
- ...
- #endif