include guard · 防止头文件被重复包含
同一头文件被 #include 多次时,#ifndef / #define / #endif 让第二次起的内容被守卫跳过,类型只定义一次
main.cpp
// 直接、且间接
// 包含同一头文件
#include
"p_r_s.h"
①第1次
#include
"select.h"
②含p_r_s.h
int main() { … }
预处理展开
p_r_s.h(带包含保护)
#ifndef
p_r_s_h
#define
p_r_s_h
// 类型定义(只能一次)
enum p_r_s {paper,…};
enum outcome {win,…};
#endif
宏 p_r_s_h :
未定义
纳入编译
展开后的编译单元
enum p_r_s {paper,…};
enum outcome {win,…};
来自第 1 次包含
enum p_r_s {paper,…};
enum outcome {win,…};
来自第 2 次包含
守卫跳过 ✓
类型只定义一次 → 编译通过
原理:
第 1 次
宏未定义 → 进入并 #define、纳入内容;
第 2 次
宏已定义 → #ifndef 为假 → 跳到 #endif
等价写法:
#pragma once
(一行)
▶ 重播