C/C++关于预编译的一些理解

2023-05-16

 

自己的一些理解:

条件编译的一个重大作用就是防止头文件的重复定义,

#ifndef   ABC_H

#define    ABC_H

#endif

假如文件ABC_H之前没有被#define过,在这里就会#define,,从而保证了一个文件只可能被执行一次,

甚至可以把#define    ABC_H看成该文件是否被执行过的一种标志

ABC_H的名字是可以随便取的,只要保证不同文件里#define 后的ABC_H对应就行,这样在逻辑上才能行得通.

一般为了方便人类观察,习惯写成某个头文件abc.h的大写形式ABC_H

 

if 与 if

条件编译是C语言中预处理部分的内容,它是编译器编译代码时最先处理的部分,
之所以能够实现条件编译是因为预编译指令是在编译之前进行处理的,通过预编译进行宏替换、条件选择代码段,然后生成最后的待编译代码,最后进行编译。

#if的一般含义是,如果#if后面的常量表达式为true,则编译它所控制的代码,如条件1成立时就代码段1,条件1不成立再看条件2是否成立,如果条件2成立则编译代码段2,否则再依次类推判断其它条件,如果条件1-N都不成力则会编译最后的代码段n+1.

条件编译里面有判断语句,比如 #if 、#else 、#elif 及 #endif
它的意思是如果宏条件符合,编译器就编译(预处理)这段代码,否则,编译器就忽略这段代码而不编译,如

#define A 0 //把A定义为0
#if (A > 1)
printf("A > 1"); //编译器没有编译该语句,该语句不生成汇编代码
#elif (A == 1)
printf("A == 1"); //编译器没有编译该语句,该语句不生成汇编代码
#else
printf("A < 1"); //编译器编译了这段代码,且生成了汇编代码,执行该语句
#endif

而 if 语句则不然,if 是 C 语言中的关键字,它根据表达式的计算结果来决定执行(执行可不是条件编译预处理,)那个语句,但是它里面的每个分支都编译(都进行了预处理和编译)了的, 如

#define A 0
if (A > 1)
printf("A > 1"); //编译器编译该语句,但因为A == 0 未执行
else if(A == 1)
printf("A == 1"); //编译器编译该语句,但因为A == 0 未执行
else
printf("A < 1"); //编译器编译该语句,因为A == 0 故执行

#if条件编译作为一个编译“开关”(常用来注释代码),比如:

#if(条件满足)
执行代码1
#else
执行代码2
#endif

 

假如编译时,确实满足条件(结果非0时),则生成的程序文件(.exe文件)中不会有执行代码2的。如果用普通if语句,生成的程序文件就会有执行代码2,这个区别看看生成文件大小就可以知道。如果你的条件在程序编译前就已经确定了,那就用#if;如果条件需要在程序运行过程中才能判断,则用if。

所以 简单地讲,条件编译是根据 宏条件 选择性地编译语句,它是编译器在编译代码时完成的;条件语句是根据条件表达式选择性地执行语句,它是在程序运行时进行的。

if的使用说明

#if的后面接的是表达式

#if (MAX==10)||(MAX==20)
code...
#endif

它的作用是:如果(MAX10) || (MAX20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)

if defined的使用

#if后面接的是一个宏。

#if defined (x)
...code...
#endif

这个#if defined它不管里面的“x”的逻辑是“真”还是“假”它只管这个程序的前面的宏定义里面有没有定义“x”这个宏,如果定义了x这个宏,那么,编译器会编译中间的…code…否则直接忽视中间的…code…代码。
另外 #if defined(x)也可以取反,也就用 #if !defined(x)

ifdef的使用

#include <stdio.h>
#define CONFIG_DEBUG 
int main()
{
    FILE *fp;
    fp=fopen("D:\\DEV\\test.txt","r"); 
    if(NULL==fp){
        printf("error!");
}
#ifdef CONFIG_DEBUG 
    printf("open test.txt ok");
#endif
    return 0;
}
#ifdef的使用和#if defined()的用法一致 
#ifndef又和#if !defined()的用法一致。

最后强调两点:
第一:这几个宏定义只是决定代码块是否被编译!
第二:别忘了#endif

补充一些便于理解的用法:

1,情况1

  #ifdef _XXXX
      ...程序段1...
  #else
      ...程序段2...
  #endif
  这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。

2,情况2

3:情况3:
  #if 常量
      ...程序段1...
      #else
      ...程序段2...
  #endif

这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。

//嵌套情况
#if 常量a
   ...程序段1...
#else
          #if 常量b
            ...程序段2...
           #else
           ...程序段3...
      #endif
#endif
这里表示,如果常量a为真(非0,随便什么数字,只要不是0),就执行程序段1。当常量a为0,常量b为真时,执行程序段2;当常量a为0,常量b为0时,执行程序段3;

 

 

 

原文章链接:

https://www.baidu.com/link?url=6qcdFoRTkxCxTVetFeOYK7ar7fMroNJfT3hXcRI4apn-pld6x6qJPFH-iQJkYUN4rJ4mXl1eSYZDNrFyw5uJYCYZ0-jftyxvjPPncJ6RqD7&wd=&eqid=aa0fcb2600007185000000065e82cb91

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

C/C++关于预编译的一些理解 的相关文章

  • 一次对带病毒软件的分析

    昨天在某葫芦侠看到实用软件版块有一个youtube视频下载器 xff0c 正好需要我就去整了一个拿来用 xff0c 下载下来打开提示有病毒 xff0c 我寻思多半又是nt安全软件瞎报 xff0c 就随手点了信任 xff0c 然后再次打开 x
  • 百一测评网站切屏检测绕过

    事情是这样的 xff0c 这几天不是临近期末嘛 xff0c 老师都开始划重点 xff0c 准备在线考试的老师也在开始测试线上考试了 xff0c 今天人工智能在百一测评发下来一套测试 xff0c 想点进去看看能不能粘贴 xff0c 结果刚出去
  • NTLM及Kerberos认证流程

    NTLM及Kerberos认证流程 NTLM认证 1 概念 NTLM是NT LAN Manager的缩写 xff0c NTLM 是指 telnet 的一种验证身份方式 xff0c 即问询 应答身份验证协议 xff0c 是 Windows N
  • 哈希传递攻击/黄金白银票据

    Q amp A Q1 xff1a pth在什么情况下能成功 哈希传递受到什么限制 什么情况下不能传递 xff1f A1 xff1a pth在获取到目标机器中RID为500的内置管理员账户或在目标机器本地管理员组的域成员账户的hash值的情况
  • MySQL查询多条数据,只取最新的一条数据

    首先 查询表fp studentItem中的studentid 61 1 xff1b 有5条数据 xff0c 我只想要id 61 163的最新数据 两种方法 xff1a 1 SELECT FROM fp studentItem where
  • 2018年最全iOS开发之第三方库

    最全iOS开发之第三方库 最新增加 EAIntroView 一个灵活的介绍界面 可以用作引导页 UI 下拉刷新 EGOTableViewPullRefresh 最早的下拉刷新控件 SVPullToRefresh 下拉刷新控件 MJRefre
  • 关于原码、反码、补码的一点心得

    在看本篇文章前 xff0c 请先抛弃类比于时钟的想法 xff0c 个人觉得那种理解方法真的没有必要 xff0c 还容易把自己搞糊涂 下面来了 在现实世界中 xff0c 数字都是以源码表示的 xff0c 例如正4的自然二进制和负4的自然二进制
  • 傅里叶变换的推导

    首先 xff0c 隆重推出傅里叶级数的公式 xff0c 不过这个东西属于 文物 级别的 xff0c 诞生于19 世纪初 xff0c 因为傅里叶他老人家生于1768 年 xff0c 死于1830 年 但傅里叶级数在数论 组合数学 信号处理 概
  • 一个抓取网上教学资源的python包

    步骤 xff1a 1 安装依赖库 xff08 前提电脑要安装有python3环境 xff09 pip install requests BeautifulSoup4 lxml 2 下载一个外国网友分享的爬虫包 xff0c 传送门 https
  • FL Studio20版本下载后覆盖升级中文选项

    音乐不仅仅是娱乐的一种形式 xff0c 这就像在每个人的灵魂中表达情感的一种方式 如今 xff0c 越来越多的音乐人选择使用音乐制作软件来进行音乐的创作 xff0c 一台电脑 一款软件以及一个外接MIDI就是一个小型的音乐工作站 xff0c
  • 驱动程序(1) win10下Visual Studio 2017的安装以及双机调试搭建

    前言 xff1a 毕业上班以来 xff0c 现在这个项目比较缺一个做windows下驱动程序开发的 xff0c 所以本人就负责这方面的工作 之前没有接触过 xff0c 完全萌新 xff0c 全靠一本武安河编著的 Windows设备驱动程序W
  • s域和z域变换笔记

    连续函数 1 常见信号的拉普拉斯变换 xff1a 脉冲信号 xff08 t xff09 1 阶跃信号 xff08 t xff09 斜坡信号 t 加速度信号 指数类信号 正弦类信号 cos wt sin wt 2 拉普拉斯变换性质 xff1a
  • 英语音标

    1 元音字母 a e i y o u 2 y属于半元音 3 其他的都是辅音字母 音标 元音音标 a 1 e 2 i e 1 e 2 i i 1 e 2 ai o 1 e 2 eu u 1 e 2 ju 辅音音标 b 1 b eg bike
  • 标准日本语初级上-------(1~12课)

    常用寒暄语 早上好 你好 晚上好 用于告别时的再见 晚安 初 願 初次见面 请多关照 常用于打招呼或者道歉 谢谢 不用谢 用于吃饭之前 用于吃饭后 你也一样 用于祝福
  • 反三角函数

    反函数以原函数的定义域为值域 以原函数的值域为定义域 反函数关于y 61 x对称 反正弦函数arcsin x sin 1 x sin x在主值区间 pi 2 pi 2 上的反函数 反余弦函数arccos x cos x在主值区间 0 pi
  • 三角变换关系

  • 高中解析几何复习

    连接 https wenku baidu com view 3f9d777476a20029bd642dc7 html
  • 日本语外来语(片假名)与英语发音对照

    k t 或者不读 r te 不断更新中 有新的发音欢迎留言
  • 标准日本语13~24课

    短语 表示 暂先 相当的 表示夸奖他人 相当的 不过程度更加强烈 除了表示已经 和过去时搭配 还可以表示马上 就要 的意思 与现在时搭配 表示劳驾 搭讪 那请吧 用于对对人邀请的同意 金 xff08 xff09 下 xff08 xff09
  • 标准日本语25~36课

    短语 表示做某事或某事态发生的时间渐渐迫近 那样的话 表示并不十分理想 但是还能过得去 xff5e xff5e 表示某个容器达到饱和状态 表示 正确 无误 恰当 xff0f 接在量词后面 表示大致 肯定上面的句子 但是有附加条件 今度 xf

随机推荐

  • 标准日本语37~42课

    短语 表示名副其实 凭感觉的判断 总觉得 特意 好不容易 43 小句 43 表示特意 但是是为下句的遗憾做铺垫的 接在数量词后 表示数量的全部 哎呀 语气词 啊 对不起 哪里 是我不好 以后当动词不特意强调形态时 便默认为基本形 语法 1
  • FL Studio水果简体中文20.9版本下载

    FL Studio软件全称是Fruity Loops Studio xff0c 由于这款软件自身logo长得像水果 xff0c 所以我们也习惯叫它 水果 它是一款全功能音频编辑工具 xff0c 将编曲 剪辑 录音以及混音集为一体的音乐编曲软
  • 嵌入式系统专用术语

    1 与硬件相关 封装 封装是指用塑料 金属或陶瓷材料等把集成电 路封在其中 封装可以保护芯片 xff0c 并使芯片与 外部世界连接 印刷电 路板 印刷电路板 PCB板 xff0c 是组装电子元件用的基板 xff0c 是电路原理图的实物化 P
  • 嵌入式C语言

  • GCC编译C语言-常见错误收录

  • 编译器报错的常见单词

    local 局部的 assignment 赋值 分配 variable 变量 incompatiable 不兼容的 initialization 初始化 conflicting 矛盾的 冲突的 statement 语句 status 状态
  • 自动控制原理(上)

    控制系统的分类 恒值控制系统 程序控制系统 随动控制系统 控制系统的基本要求 稳定性 快速性 准确性 系统的传递函数G s 输出和输入在零初始条件下 的拉氏变换比 传递函数的分母多项式 称为系统的 特征式 其最高阶次称为系统的阶次 零特征式
  • 大学时代的一些常用单词(自动化,计算机)

    proportional 比例 integral 积分 derivative 微分 polynomial 多项式 inf 无穷大 format 格式 class 类型 angle 角度 degree prime 首要的 sqrt 根号 Na
  • PID控制原理

  • matlab数据类型的一点心得

    https blog csdn net kyang624823 article details 78678075 重点看 https blog csdn net u011501388 article details 78351305 tic
  • 关于修复系统引导的一点心得

    昨天使用一款叫做分区助手的软件给笔记本C盘扩容 过程很顺利 但是在开机的时候却发现系统无限进入修复模式 用pe进入系统后 查看了各个盘的状态 还好所有盘的数据都还健在 通过这里 我也排除了C盘被清空的可能性 而且也进bios排查了设备的启动
  • 关于因中文路径而报错的一个解决办法

    昨晚安装UG10 0版本 虽然软件没有安装到中文路径下 但是因为我的账户名是带有中文的 而软件的一个临时文件夹Temp位于我的账户路径下 所以在打开软件时提示该路径出现错误 解决办法是在C盘下再建立一个Temp文件夹 打开环境变量 修改Te
  • FL Studio2023最新版可以切换成中文语言界面

    FL Studio 21是业界比较知名的水果编辑软件 xff0c 集成了音乐编辑 音频编辑和编曲等多种功能 xff0c 让你从零开始学习音乐编曲 有用户在下载FL Studio 21后不知道怎么安装和汉化 xff0c 其实简单的做下系统的设
  • 解决moocUWP版缓存PDF卡住的方法

    在设置里面把同时下载数改为1个
  • C语言中的预编译指令(不完善)

    请把此博文和这篇博文结合阅读 1 void 可以用来定义空类型指针 该指针不指向任何类型 但是在需要时可以转化为任何类型 2 嵌入式C语言在编译的时候 会先对程序中一些特殊的命令进行预处理 然后将预处理的结果和源程序一起再进行编译 预处理包
  • c源文件中要包含自己的头文件

    原博客链接 https blog csdn net khwkhwkhw article details 49798985 utm source 61 app amp from 61 timeline 引言 xff1a 我们经常在c工程中发现
  • 如何理解蕴含式的真假?

    蕴含式 AB 的反
  • stm32新建工程的一般步骤

    1 安装MDK5和f103的pack包 安装cubeMX和hal库 2 在cubeMX中新建工程 选择stm32f103rb rb rc看自己板子型号 双击进入 要看自己的板子是什么封装的 这里是LQFP封装 3 在pinconfigure
  • 解决PIL中无法引用Image

    把conda安装的pillow卸载掉 用pip重新安装 因为pillow原先只支持python2 后来志愿者把它移植到了python3中 导致有些新老版本不一 使用pip安装获得最新版本
  • C/C++关于预编译的一些理解

    自己的一些理解 条件编译的一个重大作用就是防止头文件的重复定义 ifndef ABC H define ABC H endif 假如文件ABC H之前没有被 define过 在这里就会 define 从而保证了一个文件只可能被执行一次 甚至