#ifndef
, #define
, 和 #endif
是 C++ 中用于防止头文件被多次包含的预处理指令。它们共同构成了一个叫做 include guards 的机制。下面是这些指令的详细解释:
1. #ifndef
(如果没有定义)
#ifndef
是 #if
(如果)指令的变体,用于检查某个宏是否未被定义。如果宏未定义,则执行随后的代码块。
#ifndef PROJ_EXTEND_KALMAN_HPP_
这行代码检查名为 PROJ_EXTEND_KALMAN_HPP_
的宏是否未定义。如果该宏未定义,则条件为真,编译器将处理随后的代码;如果宏已经定义,则条件为假,编译器会忽略随后的代码直到 #endif
。
2. #define
(定义宏)
#define
用于定义宏。在 include guards 中,这个指令用于定义一个唯一的宏名,表示当前头文件正在被处理。
#define PROJ_EXTEND_KALMAN_HPP_
在 #ifndef
条件成立时,这行代码会被执行,定义 PROJ_EXTEND_KALMAN_HPP_
宏。这表示该头文件已经被处理过。
3. #endif
(结束条件编译)
#endif
用于结束一个 #if
、#ifdef
或 #ifndef
指令块。它标志着条件编译块的结束。
#endif // PROJ_EXTEND_KALMAN_HPP_
整体使用方式
这些指令一起工作以确保头文件只被包含一次,防止重复定义和编译错误。以下是一个完整的示例:
#ifndef PROJ_EXTEND_KALMAN_HPP_
#define PROJ_EXTEND_KALMAN_HPP_
// 头文件的内容,例如函数声明、类定义等
void someFunction();
#endif // PROJ_EXTEND_KALMAN_HPP_
工作原理
-
第一次包含:
- 编译器在处理头文件时,遇到
#ifndef PROJ_EXTEND_KALMAN_HPP_
,发现PROJ_EXTEND_KALMAN_HPP_
这个宏没有定义,所以继续处理文件中的内容。 - 处理到
#define PROJ_EXTEND_KALMAN_HPP_
时,定义了PROJ_EXTEND_KALMAN_HPP_
宏。 - 编译器处理头文件中的内容直到
#endif
。
- 编译器在处理头文件时,遇到
-
第二次及后续包含:
- 当头文件被再次包含时,编译器会遇到
#ifndef PROJ_EXTEND_KALMAN_HPP_
,发现PROJ_EXTEND_KALMAN_HPP_
已经定义,所以跳过文件中的内容,避免重复处理。
- 当头文件被再次包含时,编译器会遇到
这种机制是 C++ 中防止头文件多重包含的标准方式,确保每个头文件在同一编译单元中只处理一次。