关于ifndef…endif用法的详解和补充

关于ifndef…endif用法的详解和补充具体示例 1 definex 定义一个宏 endif C 语言在对程序进行编译时 会先根据预处理命令进行 预处理 C 语言编译系统包括预处理 编译和链接等部分 ifndefx 先测试 x 是否被宏定义过 definex 程序段 1 如果 x 没有被宏定义过 定义 x 并编译程序段 1 else 程序段 2 如果 x 已经定义过了则编译程序段 2 的语句 忽视 程序段 1

具体示例

1、

2

一般格式是这样的:
  #ifndef xxx<标识>//如果没有定义xxx
  #define xxx<标识>//那么来定义xxx
  …
  #endif



//结束上面这个如果条件

【重要的点】<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h
  #ifndef STDIO_H
  #define STDIO_H

 #endif 

需要注意的是

【重要的点】#ifndef起到的效果是防止一个C源文件两次包含同一个头文件,而不是防止两个C源文件包含同一个头文件。网上很多资料对这一细节的描述都是错误的。事实上,防止同一头文件被两个不同的源文件包含这种要求本身就是不合理的,头文件存在的价值就是被不同的源文件包含
假如你有一个C源文件,它包含了多个头文件,比如头文件A和头文件B,而头文件B又包含了头文件A,则最终的效果是,该源文件包含了两次头文件A。如果你在头文件A里定义了结构体或者类类型(这是最常见的情况),那么问题来了,编译时会报大量的重复定义错误。
所以如果采用了#ifndef…#endif就可以避免这种重复定义;
例如:要编写头文件test.h,在头文件开头写上两行:
#ifndef _TEST_H
#define _TEST_H //一般是文件名的大写
头文件结尾写上一行:
#endif
这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。
分析:
当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H和#endif之间的代码,当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef _TEST_H和#endif之间的代码也就不会再次被包含,这样就避免了重定义了。
而把头文件的内容都放在#ifndef和#endif中,则无论头文件会不会被多个文件引用,都需要加上这个。一般格式是这样的:
#ifndef <标识>
#define <标识>


#endif
<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前面加下划线,并把文件名中的“.”也变成下划线,如:stdio.h
#ifndef _STDIO_H
#define _STDIO_H

#endif




















【补充】:变量和函数的定义和声明的区别

变量:

函数

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

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

(0)
上一篇 2025年11月14日 上午11:01
下一篇 2025年11月14日 上午11:22


相关推荐

  • js控制30秒自动页面跳转,带读秒

    js控制30秒自动页面跳转,带读秒30秒后返回首页方式一://定义函数functioncount()   {   varmyspan=document.getElementById(‘myspan’); varnumber=myspan.innerHTML; number–; document.getElementById(‘myspan’).innerHTM

    2022年5月30日
    157
  • 阿里云10M带宽的便宜购买方式[通俗易懂]

    阿里云10M带宽的便宜购买方式[通俗易懂]阿里云10M带宽的便宜购买方式

    2022年4月22日
    57
  • pycharm配置django环境_pycharm的terminal默认环境

    pycharm配置django环境_pycharm的terminal默认环境PyCharmDatabaseserverTimezonePyCharm中有提供视图化的数据库工具——Database,在使用这个工具的时候,因为时区设置的问题,会导致连接不成功。报错信息如下:Serverreturnsinvalidtimezone.Goto’Advanced’tabandset’serverTimezone’propertymanually….

    2022年8月30日
    5
  • 苏州市人工智能行业协会发布推动OpenClaw理性应用倡议:不制造焦虑、不鼓吹神话

    苏州市人工智能行业协会发布推动OpenClaw理性应用倡议:不制造焦虑、不鼓吹神话

    2026年3月12日
    2
  • 高斯径向基函数(RBF)神经网络

    高斯径向基函数(RBF)神经网络高斯径向基函数 RBF 神经网络牛顿插值法 知乎泰勒公式径向基函数 wiki 径向基网络之 bp 训练 RBF 网络逼近能力及其算法线性 非线性 使用 多项式 逼近非线性 通过调节超参数来改善多项式参数进一步拟合真实非线性 径向基函数说径向基网络之前 先聊下径向基函数径向基函数 英语 radialbasisf 缩写为 RBF 是一个取值仅依赖于到原点距离的实值函数 即 x

    2026年3月18日
    3
  • Python 递归函数

    Python 递归函数递归函数在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。递归函数特性:必须有一个明确的结束条件; 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实…

    2022年6月29日
    30

发表回复

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

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