【#ifndef, #define, 和 #endif】

2023-11-02

前言

学习AFNetWoring源码的时候,在AFN的h借接口文件又看到了这几个宏定义,学习记录一下。
请添加图片描述

作用

#ifndef, #define, 和 #endif是C/CPP的预处理指令,常常用来条件编译和防止头文件重复包含。

简介

#ifndef 它是if not define的简写,是宏定义的一种,确切的说是预处理功能(宏定义、文件包含、条件编译)三种中的一种——条件编译。

使用#ifndef可以避免以下错误:如果在.h文件中定义了全局变量,一个C文件包含了.h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误;如果加了#ifndef则不会出现这种错误。

  • #ifndef:如果未定义)用于判断指定的标识符是否已经被定义。如果该标识符未定义,则执行下面的代码块,否则跳过。
  • #define: 用于定义指定的标识符,通常用于定义宏。在条件编译中,一般用来定义一个标识符,以便在后面的代码中进行条件判断。
  • #endif :用于结束条件编译的代码块。

通常语法如下

#ifndef IDENTIFIER
#define IDENTIFIER

// 在这里放置需要执行的代码

#endif

其中,IDENTIFIER 是你自己定义的标识符名称,可以是任意合法的标识符。

这种结构的作用是为了防止头文件的重复包含。通过定义一个唯一的标识符,当该头文件第一次被包含时,IDENTIFIER 未定义,预处理器会执行 #define 下的代码块,标识该头文件已经被包含。当同一个头文件再次被包含时,由于 IDENTIFIER 已经被定义,预处理器会跳过 #define 下的代码块,从而避免了重复包含。

这种写法在头文件中很常见,以确保头文件的内容只会被编译一次,防止重复定义和冲突。

例子

以开头的代码为例

#ifndef _AFNETWORKING_
    #define _AFNETWORKING_

    #import "AFURLRequestSerialization.h"
    #import "AFURLResponseSerialization.h"
    #import "AFSecurityPolicy.h"

#if !TARGET_OS_WATCH
    #import "AFNetworkReachabilityManager.h"
#endif

    #import "AFURLSessionManager.h"
    #import "AFHTTPSessionManager.h"

#endif /* _AFNETWORKING_ */

这段代码的是OC的预编译指令,用于编译时对于代码进行条件判断和控制

  • #ifndef:预处理指令,用于判断一个标识符是否已经被定义过。如果标识符没有被定义过,则编译下面的代码块,否则忽略下面的代码块。
  • #define:预处理指令,用于定义一个标识符。在这个例子中,AFNETWORKING 就是被定义的标识符。
  • #endif:预处理指令,用于结束一个条件编译块。
    这段代码的作用是:当 AFNETWORKING 这个标识符没有被定义时,编译下面的代码块,并且将 AFNETWORKING 定义为已经被定义。这样可以避免头文件的重复引用和编译错误。

分解

#ifndef _AFNETWORKING_
#define _AFNETWORKING_

这里定义了一个标识符 _AFNETWORKING_,如果该标识符未定义(即未被之前的代码定义过),则执行下面的代码块,否则跳过。

#import "AFURLRequestSerialization.h"
#import "AFURLResponseSerialization.h"
#import "AFSecurityPolicy.h"

这里通过#import指令引入了一些其他的头文件,这些头文件可能包含了一些类或函数的声明。

#if !TARGET_OS_WATCH
#import "AFNetworkReachabilityManager.h"
#endif

这段代码使用了条件编译,判断是否为目标平台是不是watchOS,如果不是watchOS,则引入 "AFNetworkReachabilityManager.h" 头文件。

#import "AFURLSessionManager.h"
#import "AFHTTPSessionManager.h"

这里又引入了两个头文件 "AFURLSessionManager.h""AFHTTPSessionManager.h"

最后,代码块的结束部分是 #endif,用于结束条件编译的代码块。

整个结构的目的是为了确保头文件的内容只会被编译一次,避免了重复定义和冲突。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【#ifndef, #define, 和 #endif】 的相关文章

随机推荐

  • Java九大内置对象

    Java九大内置对象 1 Request对象 该对象封装了用户提交的信息 通过调用该对象相应的方法可以获取封装的信息 即使用该对象可以获取用户提交的信息 当Request对象获取客户提交的汉字字符时 会出现乱码问题 必须进行特殊处理 首先
  • decimal类型对象里面定义什么类型_详解MySQL数据类型DECIMAL(N,M)中N和M分别表示的含义...

    同事问MySQL数据类型DECIMAL N M 中N和M分别表示什么含义 M不用说 显然是小数点后的小数位数 但这个N究竟是小数点之前的最大位数 还是加上小数部分后的最大位数 这个还真记不清了 于是乎 创建测试表验证了一番 结果如下 测试表
  • 【微信小程序】导出Excel文件

    导出 doOutExcel let fileName 考勤列表 wx request url XXX method POST header content type application json Authorization token
  • PCL 最远点采样

    目录 一 算法原理 1 算法概述 2 实现流程 3 主要函数 4 参考文献 二 代码实现 三 结果展示 四 相关链接 一 算法原理 1 算法概述 Farthest Point Sampling FPS 顾名思义 也就是每次采样的时候都选择离
  • Redis 入门

    前言 redis作为nosql家族中非常热门的一员 也是被大型互联网公司所青睐 无论你是开发 测试或者运维 学习掌握它总会为你的职业生涯增色添彩 当然 你或多或少已经了解redis 但是你是否了解其中的某些细节 本片文章将详细介绍redis
  • ubuntu 安装360浏览器

    ubuntu 安装360浏览器 推荐一个我自己做的普法公众号 大可说法律 有法律方面咨询的可以关注 因为之前收藏的书签都在360浏览器 为了方便 我找到了下载360浏览器的方法 官方下载 https browser 360 cn se li
  • OpenMMLab MMYOLO目标检测环境搭建(一)

    1 环境搭建 conda create n mmyolo python 3 7 y 创建环境 conda activate mmyolo 激活环境 conda install pytorch torchvision torchaudio c
  • 【获奖公布】征文

    AI Artificial Intelligence 即人工智能 人工智能领域的研究包括机器人 语音识别 图像识别 自然语言处理和专家系统等 人工智能从诞生以来 理论和技术日益成熟 应用领域也不断扩大 可以设想 未来人工智能带来的科技产品
  • 董事长、CEO、总裁、总经理的关系

    董事长 公司董事会主席 直接领导公司里的董事会 以及附设的执行委员会 任免委员会 薪酬委员会 审计委员会等一些专门委员会 是公司的老大 首席执行官 CEO 公司董事会的代理人 执行董事会授予的部分经营管理权利 是公司政策执行机构的最高负责人
  • 自己的小碎念

    现在是2019年6月26日下午15 11 我打算写一篇日记 记下这一天的经过 早晨七点 山鸡疯狂敲门 吓得我擦点猝死 我们宿舍都起床准备参加毕业典礼 像往常一样洗漱 聊天 然后去了礼堂门口 我们在那里拿着发的歌词 也没多看几眼 和朋友们闲聊
  • rocketmq客户端日志配置

    rocketmq客户端会打印一些日志如消费进度 心跳等 默认的是滚动10个日志文件 每个100MB 又一次看到这个日志目录有几十GB 手动删除 但是悲剧的是rocketmq没有释放这个日志目录 导致不能真正的释放磁盘空间 于是研究了下怎么配
  • Android Studio 的 Android Monitor / DDMS 中不显示应用的进程(看不到 log)

    http blog csdn net u011240877 article details 53160119 问题 不知道怎么 app 对应的进程在 Android Monitor DDMS 中都看不到了 想调试或者看个日志都不行 分析 一
  • 拳王虚拟项目公社:闲鱼最强的实操赚钱方法,你一定不知道!

    闲鱼 很多人都很喜欢的一个二手交易平台 也很多人喜欢在这个平台上赚钱 于是乎就不断的找各种方法 教程 在拳王公ZH的后台每天都会有朋友搜索免费的闲鱼资源 所以拳王不得不为这些朋友们着想一下 拳王今天就满足大众的需求 写一篇自己总结实操过的干
  • python统计单词个数

    统计句子单词个数 mydict for i in input 英文句子 split if i in mydict mydict i 1 else mydict i 1 for key value in mydict items print
  • 推荐 7 月份 yyds 的开源项目

    本期推荐开源项目目录 1 Notion 的开源替代方案 2 Flutter 富文本编辑器 3 所有 Demo 的妈 4 30秒的代码 5 面向程序员的全栈资源集 6 基于项目的学习 7 开源管理系统 01 Notion 的开源替代方案 Ap
  • axios token失效刷新token怎么重新请求_Token 刷新并发处理解决方案

    对 Token 进行刷新续期 我们要解决并发请求导致重复刷新 Token 的问题 这也是设计刷新 Token 的难点 这里我会分别介绍前端和后端各自的处理方案 后端方案 利用 Redis 缓存 当同时发起多个请求时 第一个接口刷新了 Tok
  • anaconda spyder使用技巧

    spyder 很简单的python代码编辑器 目录 界面布局 快捷键 设置语言 设置默认打开文件夹 高级技巧 调试代码 高级技巧 创建spyder虚拟环境 恢复默认布局 英语阅读难的话 可以先跳到设置语言 界面布局 选项卡 file 文件
  • k8s生产环境容器内部JVM参数配置解析及优化

    试问 我们为什么要做jvm参数配置优化 避免默认条件或者复杂情况导致频繁STW或者OOM 1 堆总内存初始化大小分配和最大值分配 Xms512m Xmx512m 设置为FullGC之后的老年代内存占用的3 4倍 线下调试 1 初始分配的堆内
  • 华为OD机试真题-服务中心的最佳位置【2023Q2】【JAVA、Python、C++】

    题目描述 一家快递公司希望在一条街道建立新的服务中心 公司统计了该街道中所有区域在地图上的位置 并希望能够以此为依据为新的服务中心选址 使服务中心 到所有区域的距离的总和最小 给你一个数组 positions 其中 positions i
  • 【#ifndef, #define, 和 #endif】

    前言 学习AFNetWoring源码的时候 在AFN的h借接口文件又看到了这几个宏定义 学习记录一下 作用 ifndef define 和 endif是C CPP的预处理指令 常常用来条件编译和防止头文件重复包含 简介 ifndef 它是i