深度解析c++中#ifndef、#define和#endif

154 阅读2分钟

首先要清楚#ifndef和#endif是配对的,#define是用来定义宏文本的,这个文本就是用作#ifndef的判断条件。

  1. #ifndef (If Not Defined):

    • #ifndef 是一个条件预处理指令,用于检查指定的标识符是否已经被定义。
    • 如果指定的标识符未定义,#ifndef 后面的代码将被编译,否则将被忽略。
    • 通常,这个标识符是一个宏定义,用来控制编译过程中的条件性包含。

    示例:

    
    #ifndef MY_HEADER_H
    #define MY_HEADER_H
    
    // 这里放置你的代码,只有当 MY_HEADER_H 未定义时才会编译
    // 即前面的编译中,如果有了my_header.h文件里的代码,就不会编译下面的代码了
    
    #endif
    
  • #define

    • #define 是用来定义宏的预处理指令。宏是一种文本替换机制,可以将标识符替换为指定的文本。
    • 它通常与 #ifndef 一起使用,用来定义标识符,以便在之后的代码中检查是否已经定义。
    • 通常,宏名称用大写字母表示,以便与变量和函数名区分开来。

    示例:

    #define MY_HEADER_H
    
    // 这里的代码可以包含任何你想要在头文件中定义的内容
    

在上述示例中,#ifndef#define 一起使用,以确保头文件只被编译一次。如果 MY_HEADER_H 已经被定义,#ifndef 会忽略后续的代码,防止头文件被多次包含。

这种条件编译的技术在C++中常用于创建头文件保护(header guards),以避免多次包含同一个头文件,从而防止重复定义的问题。这有助于确保代码的一致性和正确性,并提高编译效率。头文件保护也可用于包含特定平台或条件下的代码,以满足不同情况下的编译需求。