在编写 C++ 代码时,如果在不同的.cpp文件中包含同一个.h文件,编译器在编译的时候会显示该.h文件中的变量被重复包含的错误。如何避免这种情况?——借助预处理指令。
方式1、ifndef...define...endif
#ifndef MY_HEADER_FILE_H
#define MY_HEADER_FILE_H
// 头文件内容
#endif // MY_HEADER_FILE_H
当头文件第一次被包含时,`MY_HEADER_FILE_H` 宏未定义,头文件的内容会被包含进来,同时宏会被定义。当头文件再次被包含时,由于宏已经定义,头文件的内容将被忽略。
方式2、Pragma Once
#Pragma Once
// 头文件内容
`#pragma once` 指令直接告诉编译器只包含一次该头文件。
对比ifndef...define...endif 和 Pragma Once
ifndef...define...endif | Pragma Once |
C++标准的预处理指令 | 非标准的预处理指令 |
被所有编译器支持 | 可能不被所有编译器支持 |
需要手动定义宏 | 不需要定义宏 |
由于宏的存在,两个内容完全相同的.h文件也不能同时包含。 | 只保证了Pragma Once所在的.h文件不会包含多次,不能保证内容相同的两个文件。 |
无法对.h文件中的某一段代码进行声明。 | 无法对.h文件中的某一段代码作pragma once声明,而只能针对整个文件。 |