一般在.h文件中都会看到
#ifndef FILE_H
#define FILE_H
/* ... Declarations etc here ... */
#endif
那么为什么要在.h文件中这么声明呢?
这是一种防止头文件被多次包含的预处理技术,由于各种原因可能是有问题的。在编译项目时,编译每个.cpp文件(通常)。简单来说,这意味着编译器会把你的.cpp文件,打开任何文件#included
,将它们全部连接成一个海量文本文件,然后执行语法分析,最后将它转换成一些中间代码,优化/执行其他任务,最后生成目标架构的汇编输出。因此,如果#included
一个.cpp文件下的文件多次,则编译器将附加文件内容两次,因此如果该文件中有定义,你会收到一个编译器错误,告诉你重新定义了一个变量。FILE_H
当编译过程中的预处理器步骤处理文件时,首次到达其内容时,前两行将检查是否已为预处理器定义。如果没有,它将定义FILE_H
并继续处理它和指令之间的代码#endif
。下一次该文件的内容被预处理器看到时,检查FILE_H
将是假的,所以它将立即扫描#endif
并继续。这样可以防止重新定义错误。它将定义并继续处理它和指令之间的代码。