条件编译#ifdef用法

2023-10-26

这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部 分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 
    条件编译命令最常见的形式为: 
    #ifdef 标识符 
    程序段1 
    #else 
    程序段2 
    #endif 
     
    它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。 
    其中#else部分也可以没有,即: 
    #ifdef 
    程序段1 
    #endif
     
    这里的“程序段”可以是语句组,也可以是命令行。这种条件编译可以提高C源程序的通用性。如果一个C源程序在不同计算机系统上运行,而不同的计算机又有一 定的差异。例如,我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作 必要的修改,这就降低了程序的通用性。可以用以下的条件编译: 
    #ifdef WINDOWS 
    #define MYTYPE long 
    #else 
    #define MYTYPE float 
    #endif 
     
    如果在Windows上编译程序,则可以在程序的开始加上 
    #define WINDOWS 
     
    这样则编译下面的命令行: 
    #define MYTYPE long 
     
    如果在这组条件编译命令之前曾出现以下命令行: 
    #define WINDOWS 0 
     
    则预编译后程序中的MYTYPE都用float代替。这样,源程序可以不必作任何修改就可以用于不同类型的计算机系统。当然以上介绍的只是一种简单的情况,可以根据此思路设计出其它的条件编译。 
    例如,在调试程序时,常常希望输出一些所需的信息,而在调试完成后不再输出这些信息。可以在源程序中插入以下的条件编译段: 
    #ifdef DEBUG 
    print ("device_open(%p)\n", file); 
    #endif 
     
    如果在它的前面有以下命令行: 
    #define DEBUG 
     
    则在程序运行时输出file指针的值,以便调试分析。调试完成后只需将这个define命令行删除即可。有人可能觉得不用条件编译也可达此目的,即在调试 时加一批printf语句,调试后一一将printf语句删除去。的确,这是可以的。但是,当调试时加的printf语句比较多时,修改的工作量是很大 的。用条件编译,则不必一一删改printf语句,只需删除前面的一条“#define DEBUG”命令即可,这时所有的用DEBUG作标识符的条件编译段都使其中的printf语句不起作用,即起统一控制的作用,如同一个“开关”一样。 
    有时也采用下面的形式: 
    #ifndef 标识符 
    程序段1 
    #else 
    程序段2 
    #endif 
     
    只是第一行与第一种形式不同:将“ifdef”改为“ifndef”。它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的作用相反。 
    以上两种形式用法差不多,根据需要任选一种,视方便而定。 
    还有一种形式,就是#if后面的是一个表达式,而不是一个简单的标识符: 
    #if 表达式 
    程序段1 
    #else 
    程序段2 
    #endif 
     
    它的作用是:当指定的表达式值为真(非零)时就编译程序段1,否则编译程序段2。可以事先给定一定条件,使程序在不同的条件下执行不同的功能。 
    例如:输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为小写字母输出。 
    #define LETTER 1 
    main() 
    { 
    char str[20]="C Language",c; 
    int i="0"; 
    while((c=str[i])!='\0'){ 
    i++; 
    #if LETTER 
    if(c>='a'&&c<='z') c="c-32"; 
    #else 
    if(c>='A'&&c<='Z') c="c"+32; 
    #endif 
    printf("%c",c); 
    } 
    } 
     
    运行结果为:C LANGUAGE 
    现在先定义LETTER为1,这样在预处理条件编译命令时,由于LETTER为真(非零),则对第一个if语句进行编译,运行时使小写字母变大写。如果将程序第一行改为: 
    #define LETTER 0 
     
    则在预处理时,对第二个if语句进行编译处理,使大写字母变成小写字母(大写字母与相应的小写字母的ASCII代码差32)。此时运行情况为: 
    c language 

    有人会问:不用条件编译命令而直接用if语句也能达到要求,用条件编译命令有什么好处呢?的确,此问题完全可以不用条件编译处理,但那样做目标程序长(因 为所有语句都编译),而采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。

头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。

还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:

#ifndef <标识> 
#define <标识>

...... 
......

#endif

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

#ifndef _STDIO_H_ 
#define _STDIO_H_

......

#endif


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

条件编译#ifdef用法 的相关文章

  • 制作Station主机的Armbian启动卡

    Station主机支持很多种操作系统 烧录系统可以连接电脑进行线刷 也可以制作TF卡启动卡 方便系统的切换 本文介绍了制作Armbian启动卡的方法 见视频 视频演示 通过TF卡启动的时候需要先擦除EMMC里面的系统或者暂时拆掉EMMC模块
  • 年底裁员潮,你有没有被"N+1"?

    2018年11月28日上午 前一天加班到深夜的李女士 又一大早起床匆匆赶去上班了 她在一家垂直电商公司工作多年 岁末将至 一切和往常一样 为了在年前完成比上一季度更高的 KPI 她所在团队经常通宵达旦赶工 李女士准备开始新一天的鸡血工作 主
  • 【学习体会】SIMD256技术 & AVX2指令集 & 使用immintrin的api和数据结构编写测试实例 & immintrin的api解析

    目录 SIMD256技术 AVX2指令集 C 的immintrin库 使用immintrin的api和数据结构 举个例子 计算pi immintrin的api解析 mm256 set1 pd mm256 set pd mm256 setze
  • 业务中台、技术中台、数据中台、AI中台

    中台是一种体系 生态 方法论 有标准和机制 解决顶层领域下各业务子域的高效协同和资源复用问题 中台建设强调企业级 IT部门与业务部门协同建设 各部门 各业务域是中台能力的使用方 同时也是中台能力的重要提供方 目前网上比较主流的中台定义和分类
  • 应聘者是以前上司,能力一般,职场老白兔,本不想给他通过,但他卑微哀求,怎么办?...

    什么是现世报 大概就是下面这个程序员分享的职场故事了 昨天做了一场特殊的面试 应聘者是以前的上司 面试前知道是他 但他不知道面试官是自己 今天早晨收到他发来的信息 很犹豫 因为他能力一般 典型职场老白兔 不太想用他 但又因为他的卑微而不忍
  • Linux 关中断 与 开中断

    如果你要禁止所有的中断该怎么办 在2 6内核中 可以通过下面两个函数中的其中任何一个关闭当前处理器上的所有中断处理 这两个函数定义在
  • LVGL使用Visual Studio仿真(release-v8.3版本)

    1 下载安装Visual Studio 在Microsoft官网下载Visual Studio的免费社区版即可 安装时勾选 使用c 的桌面开发 后 设置软件的安装和文件的保存路径即可 2 下载lvgl模拟工程 下载模拟工程不要下载maste
  • 区块链爆发,以太坊客户端还HOLD住吗?

    以太坊网络现在有24 270种代币 27 358笔交易等待转账 463 713个电子猫 数据截止发文时间 2018年1月19日 以太坊最近主持了很多活动 很多加密货币的爱好者认为这是个积极的信号 因为以太坊网络的使用率大增 历史更加长远并且
  • 服务器虚拟化 一虚多,服务器虚拟化多虚一

    服务器虚拟化多虚一 内容精选 换一换 虚拟IP Virtual IP Address 简称VIP 是一个未分配给真实弹性云服务器网卡的IP地址 弹性云服务器除了拥有私有IP地址外 还可以拥有虚拟IP地址 用户可以通过其中任意一个IP 私有I
  • Vue 和 React 的diff有什么不同

    作为前端广受欢迎的两个框架 React 和 Vue 几乎是面试必考的内容 特别是到了中高级前端岗 企业需要考察你对两个框架的应用 也会从源码层面考察你对框架的掌握程度 比如 Computed 属性为什么能够在依赖改变的时候 自己发生变化 V
  • 处世手册

    前言编译说明 处世手册 由两部世界经典名著组成 一部分是 智慧书 占全书内容的一半多一点点 是本书的基本内容 另一部分是 伊索寓言 占全书内容的一半少一点点 是本书的辅助内容 智慧书 的作者是巴尔塔沙 葛拉西安 1601 1658 西班牙人
  • Arduino多串口通信分离字符串最简单有效的方法

    本方法简单明了 经过本人的实际运行测试 用一个字形容perfect 串口1接收字符串格式为435 25 25 分号是分隔符 一个整型 一个浮点型 这两个数据是UNO上的传感器采集的数据 是变量 通过软件串口发送给上位机 这里是上位机的代码
  • DNS域名解析服务

    目录 前言 1 DNS系统的作用 1 1DNS系统的作用 1 2缓存域名服务器 1 3DNS系统类型 2 BIND的相关配置 3 两种查询方式 4 反向解析 5 DNS主从服务器及自动同步 6 DNS分离解析 前言 1 BIND域名服务基础
  • Python冒泡排序算法

    Num01 gt 冒泡排序定义 冒泡排序 英语 Bubble Sort 是一种简单的排序算法 它重复地遍历要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 遍历数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排
  • 十三、Java-IO进化过程之NIO

    概述 前面几篇文章我们对Java的IO体系做了一个大致的介绍 从本文开始我们将对NIO SELECTOR EPOLL Netty等携带例子做更深入的讲解 如需持续了解请关注后随时查看 解读 非阻塞IO模型 当用户线程发起一个read操作后
  • Ubuntu22.04安装配置Fcitx5中文输入法(详细)

    前言 书接上回 一时兴起将主力机的 Ubuntu 20 04 LTS 升级至了刚刚发布的 22 04 LTS 从 X 切换到 Wanyland GNOME 从 3 36 升级至 42 Python 默认为 3 10 等等 使用太新的软件包反
  • vscode执行linux脚本,如何在windows下使用vscode畅快的调试bash shell

    前言 在linux随然有很多的可以调试的bash的工具 但是如果不用ubuntu或者其它linux系的桌面系统 只有命令行的情况下 还是很吃力的 当然了 大神级别可以畅快的书写并调试 但是对于我等小白 空格多一个少一个 只能望尘莫及了 所以
  • PTAMM阅读笔记之Unity版本实现总结

    PTAMM通过综合多种计算机视觉的经典算法实现了一个 便携式的增强现实系统 首先 这种基于Map的增强现实摆脱了传统ArToolKit固定marker的限制 on line追踪及识别场景corner特征 其次 目前来看 PTAMM的增强现实
  • IDEA启动报错:Error running ‘Tomcat 8.5.34‘: Address localhost:1099 is already in use

    今天在启动IDEA编辑器的时候遇到了这样的一个报错 导致项目无法运行起来 问题如图所示 在IDEA中开启tomcat服务器时报错 端口已被占用 这是因为在tomcat开启的状态下 IDEA异常关闭 导致tomcat一直占用端口 解决办法如下
  • 在Ubuntu上安装和设置RabbitMQ服务器,轻松实现外部远程访问

    文章目录 前言 1 安装erlang 语言 2 安装rabbitMQ 3 内网穿透 3 1 安装cpolar内网穿透 支持一键自动安装脚本 3 2 创建HTTP隧道 4 公网远程连接 5 固定公网TCP地址 5 1 保留一个固定的公网TCP

随机推荐

  • ansiable的安装部署

    所需安装包 ansible 2 7 8 1 el7 noarch rpm ansible tower setup bundle 3 4 2 1 el7 tar gz libtomcrypt 1 17 25 el7 x86 64 rpm li
  • 解决 mysql 在操作值为0的timestamp类型时不能正确的处理

    JAVA连接MySQL数据库 在操作值为0的timestamp类型时不能正确的处理 而是默认抛出一个异常 就是所见的 java sql SQLException Cannot convert value 0000 00 00 00 00 0
  • 准备WebUI自动化测试面试?这30个问题你必须掌握(一)

    本文共有8600字 包含了前十五个问题 如需要后十五个问题 可查看文末链接 1 什么是WebUI自动化测试 WebUI自动化测试是指使用自动化测试工具和技术来模拟用户在Web用户界面 UI 上执行操作 并验证系统的行为是否符合预期 它涉及编
  • 【ABAP系列】SAP MAC GUI750安装过程

    公众号 SAP Technical 本文作者 matinal 原文出处 http www cnblogs com SAPmatinal 原文链接 ABAP系列 SAP MAC GUI750安装过程 前言部分 大家可以关注我的公众号 公众号里
  • spring boot 项目打包到maven仓库供其它模块使用

    在对spring boot项目进行打包发布的时候发现其它spring boot项目服务真正引用使用该spring boot包中的类 需对打包插件做如下修改
  • 博客摘录「 理一理 OC/OD 门、开漏输出、推挽输出等一些相关概念」2023年8月18日

    那我们这里主要说明一下 为什么 MOS 管需要图腾柱驱动 还是因为寄生电容 在我的 全面认识 MOS 管文章中着重提到过寄生电容 如果栅极信号是脉冲 脉冲信号跳变的时候栅极的寄生电容就会充电或者放电 从而产生电流 当脉冲频率非常高时 电容所
  • 鲶鱼效应

    鲶鱼效应 鲶鱼在搅动小鱼生存环境的同时 也激活了小鱼的求生能力 鲶鱼效应是采取一种手段或措施 刺激一些企业活跃起来投入到市场中积极参与竞争 从而激活市场中的同行业企业 其实质是一种负激励 是激活员工队伍之奥秘 需要强调的一点 在某些企业中
  • 频率计的交流耦合和直流耦合的区别_数字示波器通道耦合与触发耦合的区别

    在电子电路中 将前级电路 或信号源 的输出信号送至后级电路 或负载 称为耦合 耦合的作用就是把某一电路的能量输送 或转换 到其他的电路中去 在示波器中 存在两种耦合设置 一种是通道的耦合方式 另外一种是触发的耦合方式 今天我们来详细说说这两
  • 超全的英语短句汇集

    English 900 英语九百句常用职位英文译名超级短句成语集锦打开话匣子PC电脑词汇一百个绝佳句型李阳英语365句托福听力常用短语校园英语迷你惯用语洋话连篇至理名言 English 900 英语九百句 Back To TOP 回到顶部
  • 程序包org.jdesktop.layout不存在

    下午用netbeans写程序 遇到程序包org jdesktop layout不存在的问题 我想这是netb自带的库啊 怎么会找不到了 原因我还没有找到 解决方法如下 找到安装netbeans的路径 在platform6 modules e
  • sql select 语句 转 Json

    最近有个Es查询的需求 用户在前端输入sql语句直接拼条件 然后后台去查询 因为es本身带有类sql查询 刚开始打算用sql查的 但是分页的limit只有一个查询条数 没有from和size 比如es可以通过类sql 的 limit 100
  • 保存图片到MySQL&从MySQL读取图片

    接上次 爬取坤坤表情包 这次我们直接将表情包存到MySQL数据库而不是本地 1 创建数据库 首先创建一个数据库 数据库名为ikun 表名为img 3个字段分别为id 图片id img 二进制码 date 存储时间 其中 二进制码的存储格式应
  • 【NATS streaming】NATS streaming 简介与安装

    1 概述 市面上常见到的和Nats功能类似的消息通信系统有 ActiveMQ KafKa RabbitMq Nats 之前是Ruby编写现已修改为Go Redis C语言编写 Kestrel Scala编写不常用 NSQ Go语言编写 这些
  • 记录自用的CAN开发调试工具和上位机

    文章目录 前言 二 CANable开源软硬件 三 AMP32F103 方案的自制USB2CAN 调试器 四 TTCAN USB2CANFD调试器 二 PyQT开发CAN调试器上位机 1 CAN通信速率可设 CAN CANFD可选 2 CAN
  • 网站建设如何快速建站_网站建设快速建站有哪些方法

    网站建设快速建站方法 1 JavaScript 压缩和模块打包 JavaScript 应用是以源码形式进行分发的 而源码解析的效率是要比字节码低的 对于一小段脚本来说 区别可以忽略不计 但是对于更大型的应用 脚本的大小会对应用启动时间有着负
  • 下载频道2013上半年超人气精华资源汇总---全都是免积分下载。

    http bbs csdn net topics 390526352 下载频道2013上半年超人气精华资源汇总 全都是免积分下载 十分感谢这些免积分分享精华资源的好人 Net 1 C 入门到精通加强版 2 C 类库查询手册 Android
  • 昆仑通泰历史数据导出到u盘_MCGS配方组导出到U盘案例-专业自动化论坛-中国工控网论坛...

    说实话 第一次玩昆仑通态的屏 客户要求的功能又很复杂 真是翔都出来了 为了各位同行的福祉 开始慢慢写一些实际应用上的东西 希望大家少走歧路 如果觉得有用就点个赞 觉得小儿科就 切 一声离开就好 ok 配方组导出到U盘的脚本如下 返回值10
  • 通过示例理解数据库相关概念(一、关系,元组,域,键,笛卡儿积等等)

    出发点 数据中的各种定义实在看不下去 太离散数学了 只有直接看例子了 少牺牲点脑细胞 但是 没有了严谨的定义 很多东西就只可意味不可言传了 通过例子可以用来理解数据库的离散数学式的定义 例子 Stu表 学号 姓名 性别 班级 201901
  • 腾讯云网站备案流程(2023新版教程)

    腾讯云网站备案流程先填写基础信息 主体信息和网站信息 然后提交备案后等待腾讯云初审 初审通过后进行短信核验 最后等待各省管局审核 前面腾讯云初审时间1到2天左右 最长时间是等待管局审核时间 网站备案地区不同管局审核时间也不同 快的3天即可通
  • 条件编译#ifdef用法

    这几个宏是为了进行条件编译 一般情况下 源程序中所有的行都参加编译 但是有时希望对其中一部分内容只在满足一定条件才进行编译 也就是对一部 分内容指定编译的条件 这就是 条件编译 有时 希望当满足某条件时对一组语句进行编译 而当条件不满足时则