C/C++ 条件编译
条件编译就是指有条件的编译,即根据条件去编译代码,在编译阶段时就对代码做出取舍,有的编译,有的不编译,这样比写成一个个判断函数更有效率,比如工程代码大部分的地方都类似,只有个别语句因为使用的硬件版本不同,就可以使用条件编译增加可移植性。
条件编译的“条件”,可以是一个表达式的值,也可以是一个定义的宏。
对于前者,如果该表达式为真,则编译下面的代码,为假则不编译。对于后者,如果定义了该宏,则编译下面的代码,未定义则不编译。
后者的情况,最常见的就是头文件使用的防止重复定义的写法。
#ifndef _ABCD_H_
#define _ABCD_H_ /* ...... */ #endif
首先,如果没有定义_ABCD_H_,就定义这个宏,然后跟一段代码,以“endif”结束。此“endif”对应的是开头“ifndef”的“if”,把中间的所有代码包裹起来。
那么,编译时把所有文件包含起来,第一次编译到此处时,会定义_ABCD_H_并编译下面的代码。往下继续编译时,倘若有其它文件引用了这个头文件,会再次遇到这一段代码,然后发现_ADCD_H_已经被定义,所以“ifndef _ADCD_H_”后面的代码都不会编译,这样就防止了头文件的重复定义。
通用条件编译指令:
- #if:如果条件为真,则执行相应操作
- #elif:如果前面条件为假,而该条件为真,则执行相应操作
- #else:如果前面条件均为假,则执行相应操作
- #endif:结束相应的条件编译指令
- #ifdef:如果该宏已定义,则执行相应操作
- #ifndef:如果该宏没有定义,则执行相应操作
另外,想要取消宏的定义,可以用“#undef”加宏名来取消宏定义。
练习
定义三个汇率,第一个是人民币对美元,第二个是人民币对欧元,第三个是人民币是日元。
用户输入人民币数量,输出能换多少对应币种。
使用宏去控制程序换算哪种货币。
extra.h
#ifndef _EXTRA_H_
#define _EXTRA_H_
#include<iostream> #define USD_PER_CNY (0.1422)
#define EUR_PER_CNY (0.1278)
#define JPY_PER_CNY (15.4651) #define EXCHANGE_USD 0
#define EXCHANGE_EUR 1
#define EXCHANGE_JPY 2 #define CURRENT_EXCHANGE EXCHANGE_JPY #endif // _EXTRA_H_
main.cpp
#include "extra.h" void cal_exchange()
{
double mon_i;
double mon_o; std::cout<<"How much money(yuan): "; while(std::cin>>mon_i)
{
#if CURRENT_EXCHANGE == EXCHANGE_USD
mon_o = mon_i*USD_PER_CNY;
#elif CURRENT_EXCHANGE == EXCHANGE_EUR
mon_o = mon_i*EUR_PER_CNY;
#else
mon_o = mon_i*JPY_PER_CNY;
#endif // CURRENT_EXCHANGE std::cout<<"Money exchanged: "<<mon_o<<"\n";
std::cout<<"How much money(yuan): ";
} } int main()
{
cal_exchange();
}
头文件里控制的宏是“CURRENT_EXCHANGE”,条件编译使用表达式,根据它的值是多少来编译哪段代码,值由其它宏来决定。现在定义的是日元汇率,所以结果如下。

C/C++ 条件编译的更多相关文章
- C# 条件编译
本文导读: C#的预处理器指令从来不会转化为可执行代码的命令,但是会影响编译过程的各个方面,常用的预处理器指令有#define.#undef.#if,#elif,#else和#endif等等,下面介绍 ...
- C#-#define条件编译
本文导读: C#的预处理器指令从来不会转化为可执行代码的命令,但是会影响编译过程的各个方面,常用的预处理器指令有#define.#undef.#if,#elif,#else和#endif等等,下面介绍 ...
- 条件编译#if
1.为什么需要条件编译 客户的需求在不停地发生变化,一会儿需要这个功能,一会儿不需要这个功能.我们可以使用条件编译来方便地裁剪功能. 2.条件编译语句#if 条件编译语句#if的形式是 #if exp ...
- 条件编译#if #ifdef
近期由于一些莫名其妙的原因开始学c++,我觉得我哪天要是挂了也是被自己给折腾死的,算了,反正不是折腾死就是被淘汰,当是没事打发时间了,废话不多说,开始今天的主题. 之前接触的注释就是注释,条件语句就是 ...
- [AIR] as3 之条件编译多平台妙用
http://bbs.9ria.com/thread-418864-1-1.html 一直希望as3 可以支持条件编译,即满足A时编译函数1,满足B时则编译函数2. 最佳百度了之后,发现原来是可以实现 ...
- 认识Visual Studio 条件编译
一开始是在一些源代码中看到这些语法符号,了解到这就是" 条件编译"技术
- C# 条件编译备忘
第一步:配置管理器中新建解决方案配置 第二步:定义条件编译符号: 第三步:在代码中使用自定义的条件编译 #if CustomDebug Console.WriteLine("dsads&qu ...
- Java条件编译
学习过C语言或者C++语言的同学都知道它们支持条件编译,那么今天我们来学习下在Java语言中如何实现条件编译.Java语言本身没有提供条件编译,但是Java编译器对.java文件编译为.class文件 ...
- c#定义全局条件编译符号
在"工程"上单机右键,"属性"--->"生成"--->"条件编译符号"后边的输入框中,输入自定义的条件编译变 ...
- 如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))
作者:zyl910 从VS2010开始,提供了一个平台工作集(Platform ToolSet)选项用于配制vc编译版本.到了VS2012,更是因为默认平台工具集不支持WindowsXP,导致经常需要 ...
随机推荐
- 【平台开发】— 2.前端:vue-element-admin
前端我虽然没怎么写过,但也并不陌生.之前做web自动化,网页结构没少看,html,css,js也都断断续续了解过. 如果从空白开始写,肯定还是需要花不少时间的. 好在网上有了不少成熟的后台系统的前端脚 ...
- RedisTemplate: Failed to deserialize payload
问题 org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exce ...
- 3. 站在使用层面,Bean Validation这些标准接口你需要烂熟于胸
乔丹是我听过的篮球之神,科比是我亲眼见过的篮球之神.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免 ...
- Java常用工具类整理
字符数组转String package com.sunsheen.hcc.fabric.utils; /** * 字符数组工具 * @author WangSong * */ public class ...
- 软件定义网络(SDN)第二次实验报告
目录 实验 2 :Mininet 实验--拓扑的命令脚本生成 一.实验目的 二.实验任务 三.实验要求 四.具体实验步骤 引导实验 Part 1 引导实验 Part 2 本周实验任务完成流程 五.注意 ...
- 预科班D6
2020.09.14星期一 预科班D6 学习内容: 自习 发布小游戏 1.配置网络 #查看当前ip ifconfig #关闭NetworkManager systemctl stop NetworkM ...
- Python3使用钉钉机器人推送消息(签名方式)
import time import hmac import hashlib import base64 import urllib import json import requests impor ...
- mariadb 1
mariadb(第一章) 数据库介绍 1.什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们 ...
- 微信小程序入门到精通[更新版]
微信小程序账号与工具 在线文档:https://mp.weixin.qq.com/debug/wxadoc/dev/ 小程序开发者账号注册 微信公众平台:https://mp.weixin.qq.co ...
- OKR工作法
OKR 目标与关键成果 [Objectives and Key Results] OKR是目标管理工具,它的价值不在于是否完成OKR,而在于呈现出团队最应该关注的事情,通过持续性的沟通确保每个人都聚焦 ...