关于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 返回跳转指定页面的JS代码_页面跳转

    返回跳转指定页面的JS代码_页面跳转JS跳转页面参考代码第一种:    window.location.href=”login.jsp?backurl=”+window.location.href;第二种:    alert(“返回”);window.history.back(-1);   第三种:   window.navigate(“top.jsp”);  

    2022年8月13日
    6
  • Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目

    Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目详细讲解如何使用VueCLI搭建前端项目以及项目结构分析。

    2022年4月30日
    48
  • 软件测试外包公司有哪些_工程资料外包的坏处

    软件测试外包公司有哪些_工程资料外包的坏处一、前言:什么是软件测试外包随着最近10年创业风气的发起,已经涌起创业项目外包公司的兴起,已经不仅仅局限为了降低成本,更多的是为了解决自己雇佣技术人员或者无法管理技术人员的难题。那么外包是什么意思呢?似乎大家对外包都闻之色变!这里我们详细的认识一下什么是外包?外包类似中介派遣公司或者叫做劳务输出公司。就是我们公司把你招聘进来,但是又把你派到其他公司(甲方)工作。但是最终你的劳务合同…

    2025年7月28日
    2
  • 列车调度C语言数据结构,数据结构——列车调度

    列车调度C语言数据结构,数据结构——列车调度题目链接:https://pintia.cn/problem-sets/1045870129681440768/problems/1045870197130047495#p-2题目大意:给你一列火车,上面有表号,问给你几个火车隧道,能使车厢从大到小。一道有思维结构的模拟题。先说一下核心解体思想:就是一个序列里,有多少个从大到小排好序的序列,求个数。朴素的模拟思想,先读入一个数组,从头到尾判断,含有…

    2022年7月26日
    8
  • pycharm怎么安装requests模块_python3安装模块

    pycharm怎么安装requests模块_python3安装模块问题引入:今天在学习Python网络请求的时候,导入requests模块时一直报红色波浪线,如图:反复折腾,一直以为自己没有安装requests模块,反复安装反复卸载:安装方法:首先cd进入C:\Python27\Scripts 执行pipinstallrequests命令可以自动安装卸载方法:首先cd进入C:\Python27\Scripts 执行pipuninstallr…

    2022年8月26日
    10
  • JavaScript之继承

    JavaScript之继承

    2020年11月19日
    173

发表回复

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

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