【#ifndef, #define, 和 #endif】

前言

学习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,用于结束条件编译的代码块。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20796.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cy5.5-PEG-SH近红外荧光PEG试剂 Cyanine5.5-PEG-SH,Thiol-PEG-Cy5.5可用于活体成像

Cy5.5-PEG-SH ,Cy5.5聚乙二醇巯基 英文名称:Cy5.5-PEG-SH 中文名称:Cy5.5聚乙二醇巯基 性状: 深蓝色固体或粘性液体,取决于分子量 溶剂:溶于水、 DMSO等常规性有机溶剂 激发/发射波长:684 nm/710 nm …

学习HCIP的day.06

十一、OSFP扩展知识点 1、关于OSPF状态机的问题 (1)在MA网络中(要进行DR/BDR选举)存在7种状态机,init是路由器A收到邻居B的hello包,但该hello包中没有A的RID; (2)在点到…

js跨域的解决方案

一、什么是跨域? 指的是浏览器不能执行其他网站的脚本,简单来说是浏览器同源政策的限制,浏览器针对于ajax的限制。 同源政策 两个页面拥有相同的 协议,端口,域名 就是同源,如果有一个不相同就是不同源…

手把手教你用代码画架构图 | 京东云技术团队

作者:京东物流 覃玉杰 1. 前言 本文将给大家介绍一种简洁明了软件架构可视化模型——C4模型,并手把手教大家如何使用代码绘制出精美的C4架构图。 阅读本文之后,读者画的架构图将会是这样的: 注:该图例仅作绘图示例使…

【PCIE体系结构十一】部分物理层发送接收逻辑细节

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考书籍:《PCI.EXPRESS系统体系结构标准教材 Mindshare》 目录 物理层…

【复杂网络建模】——通过图神经网络来建模分析复杂网络

目录 一、复杂网络介绍 二、复杂网络建模分析方法 三、基于图神经网络来建模 1、数据准备 2、构建图神经网络模型 3、学习节点和边的表示 4、特征提取和预测 5、模型评估和优化 四、可视化建模分析 1、初始网络可视化 2、特征可视化 一、复杂网络介绍 复杂网络是指…

软件测试专业应届生应如何提高职场竞争力

一:巩固专业知识 背景:笔者已经做了几年的打工人,以个人经验给软件测试专业应届生一些建议。 推荐需要掌握的知识: 1、软件测试基础知识(软件生命周期每个阶段工作需了解) 2、熟悉SQL/MySQL/Oracle数据库&…

【C++】哈希/散列详细解析

前言:上篇文章介绍了unordered_set和unordered_map序列关联式容器,它们之所以效率比较高,是因为其底层使用了哈希结构。,所以这篇文章我们就来详细讲解一下哈希表。有关unordered序列关联式容器的知识,请移步至这篇文章…

python3+pytest+requests+allure+yaml测试框架搭建

目录 设计框架的原则 1.框架整体结构 2.框架各个模块说明 3.示例 3.1 先写一个测试用例 3.2 对上面的用例进行分层封装(可根据业务复杂度分两层或者三层,此处演示分三层) 3.3生成allure测试报告并查看 设计框架的原则 封装基类方法 对…

山东移动:全业务域核心系统升级,实现大幅降本增效

本文介绍了山东移动引入 OceanBase 到山东省 BOSS/CRM 核心系统领域的相关情况。欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 中国移动通信集团山东有限公司(以下简称"山东移动") 隶属于中国移动通信集团公司…

发现一个国产BI软件,做财务数据分析效果绝了

如果是一般的财务数据分析,BI软件们都能做,但如果真要深入了解财务痛点,逐个击破财务数据分析难点,实现多维立体自助式的财务数据分析,那就难。就目前而言,财务数据分析做得好的国产BI软件也就一个奥威BI软…

java版Spring Cloud+SpringBoot+mybatis+uniapp b2b2c 多商户入驻商城 直播 电子商务

J2EE企业分布式微服务云快速开发架构 Spring CloudSpring Boot2MybatisOauth2ElementUI 前后端分离 1. 鸿鹄Cloud架构清单 2. Commonservice(通用服务) 通用服务:对spring Cloud组件的使用&封装,是一套完整的针对于分布式微…

原神QQ机器人BOT搭建教程Ubuntu系统

原神QQ机器人BOT搭建教程Ubuntu系统 大家好我是艾西,今天跟大家分享的是YUAN神qi鹅群机器人bot搭建方式以及详细的操作步骤。跟上艾西的节奏准备发车啦! 前言:(xxxx即为xxxx)(zzz即为zzz) qi…

RK 平台MIPI 点屏注意事项

转自:https://www.cnblogs.com/chorm590/p/11658360.html rk 平台关于 MIPI 屏幕的点屏流程已经非常完善了,基本上只要确定了硬件没问题、接线没问题、屏幕没问题,再稍稍配置一下 dtsi 里的参数就可以的了。 MIPI 点屏流程大致可以概括为以下…

i春秋 Misc Web 爆破-1

打开链接是PHP源码 代码审计: include "flag.php"; 表示文件中包含flag.php文件,即根目录下存在flag.php $a $_REQUEST[hello]; 命名一个变量a来接收超全局变量$_REQUEST(接收表单’hello’数据,请求一个为hello的参…

顶级白帽黑客必备的十大黑客技术

1.熟悉Linux系统和命令行操作: Linux是黑客的基石,几乎所有黑客工具和技术都是在Linux平台上运行的,熟悉Linux系统和命令行操作是必须的。 2.掌握网络协议和TCP/IP模型: 了解TCP/IP模型、网络协议和通信流程是黑客攻击的基础&a…

Java并发编程:并发问题和多线程技术的应用和优化

章节一:引言 在当今的软件开发领域中,多线程编程是一项至关重要的技术。随着处理器核心数量的增加和计算机系统的并行性的不断提高,充分利用多核心处理器的能力已成为现代软件开发的关键要素之一。Java作为一种强大的编程语言,在…

世界超高清大会发布重大技术成果:博冠自主创新推动8K摄像机攻关

一、世界超高清大会背景介绍: 近日,由工业和信息化部、国家广播电视总局、中央广播电视总台、广东省人民政府主办的2023世界超高清视频产业发展大会在广州越秀国际会议展览中心盛大召开。自2018年创办以来,大会已成功举办四届,成…

安装Ubuntu18.04双系统、干净卸载,并在Ubuntu系统中安装CARLA模拟器

Ubuntu系统安装 Ubuntu系统安装参照流程 Ubuntu 双系统安装流程_ubuntu双系统_地球被支点撬走啦的博客-CSDN博客 Ubuntu系统卸载 1.将开机启动项设置默认为Windows,进入BIOS设置界面调整BootDevice中Windows和Ubuntu的顺序,将Windows调整在Ubuntu前边…

PMP课堂模拟题目及解析(第11期)

101. 一家咨询公司的负责人启动一个项目来扩大公司提供的服务数量,这公司具有竞争优势、出色的企业知识以及卓越的声誉,高管团队担心与增加新服务相关的负面业务结果的可能性。若要评估负面业务结果的可能性和影响,项目经理应该使用什么&…