
n. 如果未定义
To guarantee that the header is processed only once in a given source file, we start by testing the #ifndef.
为了保证头文件在给定的源文件中只处理过一次,我们首先检测 #ifndef。
For example, you can add more #ifndef sections in the code by providing a tab for this to be added to the code.
例如,您可以为添加到 这个代码的数据段提供一个页签,从而以代码的形式添加更多的 ifndef 部分。
在工程实践中,#ifndef 常与 #define 和 #endif 配合构成头文件保护机制。例如:
#ifndef HEADER_NAME_H
#define HEADER_NAME_H
// 头文件内容
#endif
当编译器首次处理该头文件时,由于 HEADER_NAME_H 未定义,将执行 #define 定义该宏并包含内容。后续重复包含时,因宏已存在,编译器将跳过内容。
根据 ISO/IEC 9899:2018 C 语言标准第 6.10.1 章节,预处理指令通过条件包含特定代码来适配不同编译环境,这种机制有效解决了以下问题:
相较于 #pragma once 指令,#ifndef 具有更好的跨编译器兼容性,但需要开发者确保宏命名的唯一性。GNU C 预处理器手册建议采用「项目路径_文件名_H」的命名规范来降低命名冲突概率。
#ifndef
是 C/C++ 编程语言中的预处理指令,全称为"if not defined"(如果未定义)。它的核心作用是根据某个宏是否被定义,控制代码在预处理阶段的编译条件。
语法结构
#ifndef 宏名称
代码块
#endif
#endif
。#define
),则直接跳过该代码块。典型用途
防止头文件重复包含
在头文件开头使用 #ifndef
检查唯一标识宏(如 #ifndef HEADER_H
),若未定义则定义该宏并声明内容。这能避免多次引入同一头文件导致的重复定义错误。例如:
#ifndef MY_HEADER_H
#define MY_HEADER_H
// 头文件内容(如函数声明、结构体定义等)
#endif
条件编译
结合不同平台或配置的宏定义(如 _WIN32
、DEBUG
),选择性地编译平台相关代码或调试代码。
相关指令
#ifdef
:与 #ifndef
逻辑相反,检查宏是否已定义。#else
:提供备选代码块。#define
:定义宏。MY_HEADER_H
)。【别人正在浏览】