【C/C++】ifndef/define/endif的作用

【C/C++】ifndef/define/endif的作用C C ifndef define endif 的作用主要作用隐藏危险解决办法 reference 参考资料来源于网上 还未经本人实验证明 主要作用 防止头文件被重复包含和编译 解释 ifndef 起到的效果是防止一个源文件两次包含同一个头文件 那么一个源文件为什么会两次包含同一个头文件呢 情况 1 你写的 test cpp 里包含了 a h 和 b h a h 里包含了 b h 所以 b h 就

参考资料来源于网上,还未经本人实验证明。

1 作用

  防止头文件被重复包含和编译。 头文件重复包含会增大程序大小,重复编译增加编译时间。

  解释#ifndef起到的效果是防止一个源文件多次包含同一个头文件。那么一个源文件为什么会两次包含同一个头文件呢?
  你写的test.cpp里包含了a.hb.ha.h里包含了b.h,所以b.h就会被包含和编译两次。

/*file: test.cpp*/ #include  
     #include  
     ······ /*file: a.h*/ #include  
     ······ 

2 缺失ifndef的风险

1、重复定义
如果b.h中定义了一个变量b,在编译test.cpp时就会报重复定义的错误。

/*file: test.cpp*/ #include  
     #include  
     ······ /*file: a.h*/ #include  
     /*file: b.h*/ int b; ······ 

预处理阶段test.cpp展开头文件后变成:

/*file: test.cpp*/ /*#include 
   
     -> #include 
    
      */ 
     
    int b; ······ /*#include 
   
     */ 
    int b; ······ 

变量b重复定义。

2、无限循环编译
你写的test.cpp里包含了a.hb.ha.h里包含了b.hb.h里包含了a.h,所以a.hb.h就会循环包含,预处理阶段就会不停地循环展开头文件。

/*file: test.cpp*/ #include  
     #include  
     ······ /*file: a.h*/ #include  
     ······ /*file: b.h*/ #include  
     ······ 

编译器会报Error #include nested too deeply的错误。

3 解决办法

以无限循环编译中的情况为例,把a.h改写成:

#ifndef _A_H_ #define _A_H_ ... #include  
      ... #endif ······ 

这样子为什么不会报错了呢?
  在预处理阶段,会先展开test.cpp中的头文件a.h,执行到#ifndef _A_H_,发现此时并没有_A_H_并没有被define,所以继续执行#define _A_H_,此时_A_H_就被define了;当展开b.h,执行到文件里的#include
,进入a.h执行#ifndef _A_H_,发现_A_H_已经被define了,所以直接跳到a.hendif之后的语句执行。这样子就可以保证a.h不会被重复包含。如果要确保b.h不会被重复包含就该写成:

#ifndef _B_H_ #define _B_H_ ... #include  
     ... #endif ······ 

4 建议

  所有头文件前后都加上ifndef/define/endif。

5 reference

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205600.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午5:38
下一篇 2026年3月19日 下午5:39


相关推荐

  • PTA-集合相似度[通俗易懂]

    PTA-集合相似度[通俗易懂]原题链接输入样例:33 99 87 1014 87 101 5 877 99 101 18 5 135 18 9921 21 3输出样例:50.00%33.33%#include<bits/stdc++.h>#define x first#define y second#define send string::nopsusing namespace std;typedef long long ll;const int N = 1e4 + 10;cons

    2022年8月9日
    9
  • 基于jQuery的自适应图片左右切换

    效果预览:http://hovertree.com/code/jquery/smjv6d0n.htm基于jQuery编写的横向自适应幻灯片切换特效全屏自适应jquery焦点图切换特效,在IE6这个

    2021年12月21日
    54
  • 基数排序算法

    基数排序算法基数排序 区别与其他排序算法

    2026年3月16日
    2
  • Java 数组、List初始化赋值

    Java 数组、List初始化赋值1 数组初始化赋值 第一种初始化赋值方式 String strs1 1 2 第二种初始化赋值方式 String strs2 newString 1 2 2List 初始化赋值 第一种初始化赋值方式 推荐 List String strList1 Arrays asList newString 1 2 第二种初始化赋值方式 List String strList2 newArrayList String String

    2026年3月16日
    2
  • DIV+CSS颜色边框背景等样式

    1.使用css缩写使用缩写可以帮助减少你CSS文件的大小,更加容易阅读。css缩写的主要规则请参看《常用css缩写语法总结》,css缩写的主要规则如下:颜色16进制的色彩值,如果每两位的值相同,

    2021年12月22日
    45
  • web项目的中英文切换功

    web项目的中英文切换功谈到 web 项目页面部分的中英文切换功能 实现的方法有很多种 一是直接将所有的页面做一个中文版 一个英文版 通过按钮进行切换 这种做法的坏处就是维护起来很不方便 当页面部分需要修改时 两个版式的页面相应部分都需要修改 二是通过调用 API 插件的方式 比如谷歌 百度的插件 这种方法需要在联网的情况下使用 不太适合在局域网中发布的项目 第三种方法 做号中英文的对照表 通过 JS 方式引入 本文中将讲到第三

    2025年8月20日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号