c25---条件编译
//
// main.c
// 条件编译(宏定义是简单的替换,要给参数和结果都加括号) #include <stdio.h> #define SCORE 90 #define DEBUG 1 // 0是调试阶段 1是发布阶段
//printf和打印log是很消耗性能的。 #if DEBUG == 0
// 调试阶段
#define NJLog(format, ...) printf(format,## __VA_ARGS__)
#else
// 发布阶段
#define NJLog(format, ...)
#endif /*
条件编译和选则结构if的共同点
都可以对给定的条件进行判断, 添加满足或者不满足都可以执行特定的代码
条件编译和选则结构if的共区别
1.生命周期不同
if 运行时
#if 编译之前
2.#if需要一个明确的结束符号 #endif
为什么需要一个明确的结束符号?
如果省略掉#endif, 那么系统就不知道条件编译的范围, 那么会将满足条件之后的第二个条件之后的所有内容都清除(不参与编译)
3.if会将所有的代码都编译到二进制中
#if只会将满足条件的部分一直到下一个条件的部分 编译到二进制中 条件编译的优点
1.缩小应用程序的大小 应用场景:
用于调试和发布阶段进行测试
调试阶段: 程序写代码的阶段
发布阶段: 上传到AppStore的阶段
*/
int main(int argc, const char * argv[]) {
// 条件编译和if非常非常像
// if选择结构会对给定条件进行判断, 如果条件满足就执行if后面大括号中的内容
// 条件编译也一样, 会对给定的条件进行判断, 如果条件满足就编译条件后面的内容 int score = ;
if (score == ) {
printf("牛逼\n");
printf("发朵大红花\n");
NJLog("牛逼\n");
NJLog("发朵大红花\n");
}else if(score == )
{
printf("牛X\n");
printf("发朵小红花\n");
NJLog("牛X\n");
NJLog("发朵小红花\n");
}else
{
printf("继续加油\n");
printf("别哭\n");
NJLog("继续加油\n");
NJLog("别哭\n");
} int score = ; /*
预处理指令什么时候执行? 编译之前。
变量什么时候定义? 执行了才会定义。编译之后。
注意点: 条件编译不能用来判断变量, 因为不在同一个生命周期
君生我未生, 我生君已老
一般情况下, 条件编译是和宏定义结合在一起使用的(都是预编译指令,生命周期一样)
*/
#if score == 100
#if SCORE == 100
printf("牛逼\n");
printf("发朵大红花\n");
#elif SCORE == 90
printf("牛X\n");
printf("发朵小红花\n");
#else
printf("继续加油\n");
printf("别哭\n");
#endif // 作为结束符号,打印"继续加油,别哭" #if DEBUG == 0 //预编译指令都以#开头
char *name = "lnj";
char *pwd = "";
#else
char *name = NULL;
char *pwd = NULL;
#endif //结束符号
printf("name = %s, pwd = %s\n", name, pwd);
NJLog("name = %s, pwd = %s\n", name, pwd); return ;
}
//
// main.c
// 条件编译其它写法 #include <stdio.h> #define SCORE 100
#define COUNT 50 int main(int argc, const char * argv[]) { #ifdef SCORE // 判断是否定义了后面的宏
printf("score\n");
#elif COUNT
printf("count\n");
#else
printf("OTHER\n");
#endif #ifndef SCORE // 是不是没有定义名称叫做SCORE的宏
printf("no score\n");
#else
printf("score\n");
#endif #if defined(SCORE) // 判断是否定义了SCORE这个宏
printf("score\n");
#else
printf("no score\n");
#endif #if !defined(SCORE) // 判断是否没有定义SCORE这个宏
printf("no score\n");
#else
printf("score\n");
#endif return ;
}
c25---条件编译的更多相关文章
- 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,导致经常需要 ...
随机推荐
- shell 实用命令学习
查找文件 -iname 大小写不敏感 “*.log” .log后缀的文件 -type d 文件类型为目录的 find ./ -name 'index.html' 查找当前目录,及其子目录下文件
- WPF TextBox 仅允许输入数字
因为在 IValueConverter 实现中,当文本不能转换为目标类型时返回 DependencyProperty.UnsetValue ,Validation.GetHasError 返回 tru ...
- DeltaFish 校园物资共享平台 第二次小组会议
软工第二周小组会议 会议地点:三教讨论区 会议时间:9:00 ~ 10:00 与会人员:软工小组成员 请假人员:刘鼎乾 整理人:艾寅中 会议记录 一.小组分工 在经过一周的调研后,组长根据调研结果和对 ...
- AO如何获取SDE数据库中的数据
/// <summary> /// 获取Table类型表的记录 /// </summary> /// <param name="relationCheckCla ...
- MyEclipse加入jquery.js文件missing semicolon的错误
今天打开项目,发现有一个小红叉,虽然不影响项目的编译和运行,但是看着非常影响心情.原因是jquery-1.8.2.min.js报了一堆missing semicolon的错误.之所以会这样,其实是My ...
- OpenCv: 二维坐标的旋转方程
1. 可以写成一个矩阵的形式,也可以写成向量的形式: b 为选转角度加pi/2 x1 = x cos(b) - ysin(b) ; y1 = x sin(b) + y cos(b).
- 利用string 字符串拷贝
序言:对于laws的代码,完全从Matlab中转来.其中用到了字符串复制和对比的函数. C++要求: 输入字符串,根据字符串,来确定选择数组,用于下一过程 MatLab代码: (1).文件calLaw ...
- html 表单赋值 和 时间戳 转换
<script> window.onload = function () { var str; // console.log(@ViewBag.ID); $.post("/Ser ...
- springboot 大致启动流程
SpringApplication的run方法的实现是我们本次旅程的主要线路,该方法的主要流程大体可以归纳如下: 1) 如果我们使用的是SpringApplication的静态run方法,那么,这个方 ...
- python 从Excel中取值
import openpyxl from openpyxl import load_workbook def open_file(file_path): workbook = load_workboo ...