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(一行)