问题

#ifdef HELIB_DEBUG
long pa, pb;
std::vector<long> slots;
decryptBinaryNums(slots, a, *dbgKey, *dbgEa, false);
pa = slots[0];
decryptBinaryNums(slots, b, *dbgKey, *dbgEa, true);
pb = slots[0];
decryptAndSum((std::cout << " multByNegative: " << pa << '*' << pb << " = "),
nums,
true);
#endif

代码中经常见到这种<#ifdef>开头,<#endif>结尾的程序,下面一探究竟!

介绍

条件编译是指预处理器根据条件编译指令,有条件地选择源程序代码中的一部分代码作为输出,送给编译器进行编译。主要是为了有选择性地执行相应操作,防止宏替换内容(如文件等)的重复包含。常见的条件编译指令如表 1 所示

#if-#else-#endif

调用格式为:

#if 条件表达式
程序段1
#else
程序段2
#endif

功能为:如果 #if 后的条件表达式为真,则程序段 1 被选中,否则程序段 2 被选中。

注意,必须使用 #endif 结束该条件编译指令

#include<stdio.h>
#define RESULT 0//定义 RESULT 为 0
int main (void)
{
#if !RESULT //或者 0==RESULT
printf("It's False!\n");
#else
printf("It's True!\n");
#endif //标志结束#if
system("pause");
return 0;
}

上述程序中,首先定义了 RESULT 为 0,在 main 中使用 <#if-#else-#endif> 条件判断语句,如果 RESULT 为 0,则输出 It's False!,否则输出 It's True!。本例输出为:It's False!。

使用 #if 0 ... #endif 来实现注释,且可以实现嵌套

把 #if 0 改成 #if 1 来执行 code 的代码

这种形式对程序调试也可以帮助,测试时使用 #if 1 来执行测试代码,发布后使用 #if 0 来屏蔽测试代码。

C++中的条件编译

#include <iostream>
using namespace std; int main()
{
int a=8,b=5;
#if 1
cout <<"a="<< a;
#else
cout <<"b="<< b;
#endif
getchar();
return 0;
}  

#ifndef-#define-#endif

调用格式为:

#ifndef 标识符
#define 标识符 替换列表
//...
#endif

功能为:一般用于检测程序中是否已经定义了名字为某标识符的宏,如果没有定义该宏,则定义该宏,并选中从 #define 开始到 #endif 之间的程序段;如果已定义,则不再重复定义该符号,且相应程序段不被选中。

例如:

#ifndef PI
#define PI 3.1416
#endif

上述程序段,用于判断是否已经定义了名为 PI 的宏,如果没有定义 PI,则执行如下宏定义。

#define PI 3.1416

如果检测到已经定义了 PI,则不再重复执行上述宏定义。
该条件编译指令更重要的一个应用是防止头文件重复包含。
如果 f.c 源文件中包含 f1.h 和 f2.h 两个头文件,而 f1.h 头文件及 f2.h 头文件中均包含 x.h 头文件,则 f.c 源文件中重复包含 x.h 头文件。可采用条件编译指令,来避免头文件的重复包含问题。所有头文件中都按如下格式:

#ifndef _HEADNAME_H_
#define _HEADNAME_H_
//头文件内容
#endif

当该头文件第一次被包含时,由于没检测到该头文件名对应的符号(宏名)_HEADNAME_H_,则定义该头文件名对应的符号(宏),其值为该系统默认。并且,该条件编译指令选中 #endif 之前的头文件内容;如果该头文件再次被包含时,由于检测到已存在以该头文件名对应的符号(宏名),则忽略该条件编译指令之间的所有代码,从而避免了重复包含。

#if-#elif-#else-#endif

调用格式为:

#if 条件表达式1
程序段 1
#elif 条件表达式2
程序段 2
#else
程序段3
#endif

功能为:先判断条件1的值,如果为真,则程序段 1 被选中编译;如果为假,而条件表达式 2 的值为真,则程序段 2 被选中编译;其他情况,程序段 3 被选中编译。

#ifdef-#endif

调用格式为:

#ifdef 标识符
程序段
#endif

功能为:如果检测到已定义该标识符,则选择执行相应程序段被选中编译;否则,该程序段会被忽略。

例如:

#ifdef N
#undef N
//程序段
#endif

功能:如果检测到符号 N 已定义,则删除其定义,并选中相应的程序段。

参考

1、条件编译,C语言条件编译详解

C:条件编译的更多相关文章

  1. C# 条件编译

    本文导读: C#的预处理器指令从来不会转化为可执行代码的命令,但是会影响编译过程的各个方面,常用的预处理器指令有#define.#undef.#if,#elif,#else和#endif等等,下面介绍 ...

  2. C#-#define条件编译

    本文导读: C#的预处理器指令从来不会转化为可执行代码的命令,但是会影响编译过程的各个方面,常用的预处理器指令有#define.#undef.#if,#elif,#else和#endif等等,下面介绍 ...

  3. 条件编译#if

    1.为什么需要条件编译 客户的需求在不停地发生变化,一会儿需要这个功能,一会儿不需要这个功能.我们可以使用条件编译来方便地裁剪功能. 2.条件编译语句#if 条件编译语句#if的形式是 #if exp ...

  4. 条件编译#if #ifdef

    近期由于一些莫名其妙的原因开始学c++,我觉得我哪天要是挂了也是被自己给折腾死的,算了,反正不是折腾死就是被淘汰,当是没事打发时间了,废话不多说,开始今天的主题. 之前接触的注释就是注释,条件语句就是 ...

  5. [AIR] as3 之条件编译多平台妙用

    http://bbs.9ria.com/thread-418864-1-1.html 一直希望as3 可以支持条件编译,即满足A时编译函数1,满足B时则编译函数2. 最佳百度了之后,发现原来是可以实现 ...

  6. 认识Visual Studio 条件编译

    一开始是在一些源代码中看到这些语法符号,了解到这就是" 条件编译"技术

  7. C# 条件编译备忘

    第一步:配置管理器中新建解决方案配置 第二步:定义条件编译符号: 第三步:在代码中使用自定义的条件编译 #if CustomDebug Console.WriteLine("dsads&qu ...

  8. Java条件编译

    学习过C语言或者C++语言的同学都知道它们支持条件编译,那么今天我们来学习下在Java语言中如何实现条件编译.Java语言本身没有提供条件编译,但是Java编译器对.java文件编译为.class文件 ...

  9. c#定义全局条件编译符号

    在"工程"上单机右键,"属性"--->"生成"--->"条件编译符号"后边的输入框中,输入自定义的条件编译变 ...

  10. 如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))

    作者:zyl910 从VS2010开始,提供了一个平台工作集(Platform ToolSet)选项用于配制vc编译版本.到了VS2012,更是因为默认平台工具集不支持WindowsXP,导致经常需要 ...

随机推荐

  1. 数据结构课程设计报告-C 语言整数单链表的表示和实现

    数据结构课程设计报告 专业名称:计算机科学与技术 课程名称:数据结构        实训题目:整数单链表的表示和实现                            实训环境:C 语言实现( D ...

  2. java4~6次大作业全面总结

    一:前言: 知识点总结: 面向对象设计: 智能家居强电电路模拟系统:设计了多种控制设备(开关.分档调速器.连续调速器)和受控设备(灯.风扇)的类,并通过继承和多态实现设备的特有行为. 答题判题程序:设 ...

  3. WiFi基础(八):WiFi安全、认证与加密

    liwen01 2024.11.17 前言 计算机网络在给人们带来便利的同时,也引入了安全风险,对于无线WiFi网络而言,风险更高.无线 WiFi 网络安全主要包括两大部分:接入认证和数据加密. 虽然 ...

  4. 成为JavaGC专家Part II — 如何监控Java垃圾回收机制

    本文是成为Java GC专家系列文章的第二篇.在第一篇<深入浅出Java垃圾回收机制>中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5 ...

  5. Java实时多任务调度过程中的安全监控设计

    方浩波 (fanghb@eastcom.com)东方通信网络研究所 简介: 在一系列关联的多任务的实时环境中,如果有一个任务发生失败,可能导致所有任务产生连锁反应,从而造成调度失控的局面.特别是对于核 ...

  6. nginx配置之Gzip压缩

    Nginx开启Gzip压缩功能, 可以使网站的css.js .xml.html 文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能!  Web网站上的图片,视频等其它多媒体文件以及大文件,因 ...

  7. DevEco Studio:状态管理与事件处理

    DevEco Studio:状态管理与事件处理 引言 在现代前端开发中,状态管理和事件处理是构建交互式应用的核心.DevEco Studio,作为华为推出的开发环境,支持开发者使用TypeScript ...

  8. Chrome浏览器本地安装插件

    前情 Chrome是目前世面上很受欢迎的浏览器,你可以通过它的插件扩展功能安装插件优化使用体验和增加功能. 坑位 对于国内受墙影响的用户无法直接通过应用商店安装插件,通过离线安装插件会发现浏览器会提示 ...

  9. 恭喜您获得【智能工具箱】,使用后图片大小-80%、视频大小-90%、PPT附带在线预览属性…

    小梁是一名小学英语老师,因为疫情影响,全市中小学都要求师生居家进行线上教学.学习.因为线上教学的各种局限性,为保证教学质量,学校要求老师们提前录制好课程,在上课时播放录制课程,老师自己需要在一旁进行线 ...

  10. vmagent如何快速采集和转发Metrics

    vmagent如何快速采集和转发Metrics 本文介绍了vmagent的设计细节,参考自:vmagent-how-it-works VictoriaMetrics agent是一个轻量级工具,用于采 ...