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,导致经常需要 ...
随机推荐
- [转]Java web 开发 获取用户ip
如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,那么真正的用户端的真实IP则是取X-Forwarded-For中第一个非unknown的有效IP字符串. pu ...
- 关于Membership和身份认证的记录
在今天写好的code中测试环节,当我用webconfig中的测试数据库就是ok的,但是更替为正式的就不行了: 报错的类是MemberShip,那就关系到身份认证的环节了 找了几个链接,记录下 1.身份 ...
- git解决内容冲突
内容冲突的冲突处理 两个用户修改了同一个文件的同一块区域,git会报告内容冲突. 解决办法:打开发生冲突的文件,会发现 <<<<<<< HEADtest in ...
- windows10上安装mysql详细图文教程
在windows10上安装mysql详细图文教程 这篇文章主要介绍了在windows10上安装mysql详细图文教程,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧 环境:windw ...
- Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)
多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...
- matlab读取mysql数据
conn = database('ci_bootstrap_3','root','1q1q1q1q','com.mysql.jdbc.Driver','jdbc:mysql://localhost:3 ...
- js中call、apply、bind的区别
var Person = { name : 'alice', say : function(txt1,txt2) { console.info(txt1+txt2); console.info(thi ...
- mysql字符集和排序规则
1.关于字符集和排序规则所为字符集,就是用来定义字符在数据库中的编码的集合.常见的字符集有:utf8(支持中文)和AccIS(不支持中文) 数据库中的排序规则用来定义字符在进行排序和比较的时候的一种规 ...
- HTML <area> 对象
<area>对象的属性 属性 描述 W3C alt 设置或返回当浏览器无法显示某个区域时的替换文字. Yes coords 设置或返回图像映射中可点击区域的坐标. Yes hash 设置或 ...
- 工厂模式的python实现
#1.什么是工厂模式 #2.工厂模式的分类 ''' 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂方法模式 ''' #3.简单工厂模式的python实现 from abc import ABC ...