关注+星标公众号,不错过精彩内容
转自 | 技术让梦想更伟大
常见的预编译指令如下:
#define | 定义一个预处理宏 |
#undef | 取消宏的定义 |
#if | 编译预处理中的条件命令,相当于C语法中的if语句 |
#ifdef | 判断某个宏是否被定义,若已定义,执行随后的语句 |
#ifndef | 与#ifdef相反,判断某个宏是否未被定义 |
#elif | 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if |
else | 与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else |
endif | #if, #ifdef, #ifndef这些条件命令的结束标志. |
defined | 与#if, #elif配合使用,判断某个宏是否被定义 |
2.应用举例#undef可以取消宏定义,与#define对应。
#define
#define命令定义一个宏:,按照是否带参数通常分为对象宏、函数宏两种。
对象宏: 不带参数的宏被称为"对象宏(objectlike macro)"。对象宏多用于定义常量、通用标识。例如:
// 常量定义
#define MAX_LENGTH 100
// 通用标识,日志输出宏
#define SLog printf
// 预编译宏
#define _DEBUG
// 最小值函数
#define MIN(a,b) ((a)>(b)? (a):(b))
// 安全释放内存函数
#define SAFE_DELETE(p) {if(NULL!=p){delete p; p = NULL;}}
#if defined(VAX) && defined(UNIX) && !defined(DEBUG)
// ... codes while definded ABC
// ... codes while CODE_VERSION > 2
// ... remained cases
// ... some declaration codes
// ... some codes
// ... other codes
// ...
...
// ... statement
常量表达式可以是包含宏、算术运算、逻辑运算等等的合法C常量表达式,如果常量表达式为一个未定义的宏, 那么它的值被视为0。
3.特别注意
#if 和 #ifdef的区别
在判断某个宏是否被定义时,应当避免使用#if,因为该宏的值可能就是被定义为0。而应当使用#ifdef或#ifndef。看两段段代码,哪段代码会被编译进去,强调下是编译进去,不是执行。#define XXX 0
// 第一段条件编译
#ifdef XXX
逻辑1
#else
逻辑2
#endif
#define XXX 0
// 第二段条件编译
#if XXX
逻辑1
#else
逻辑2
#endif
- 第一段条件编译:逻辑1会被编译进去
- 第二段条件编译:逻辑2会被编译进去
区别:#if既关心宏是否定义,又关心宏的逻辑的真假#ifdef(#if defined())、#ifndef(#if !defined())仅仅关心宏是否被定义,不关心宏的逻辑真假
#if 0 或 #if 1注释当屏蔽掉大块代码时,使用"#if 0"比使用"/**/"要好。(因为用"/**/"做大段的注释时,需要防止被注释掉的代码段中有嵌套的"/**/",一旦出现"/**/"嵌套"/**/"的情况,会导致你注释掉的代码区域并不是你想要的区域范围)
1)常见的一种,如有一段不想要的代码,可以直接用"#if 0 ... #endif"形式来注释,效果等同于"/**/"
...code...
#endif
2)选择结构的条件编译。(如果常量为真【非0,随便什么数字,只要不是0】,就执行程序段1,否则执行程序段2。)
#if constant
...code 1...
#else
...code 2...
#endif
3)嵌套情况。(如果常量a为真【非0,随便什么数字,只要不是0】,就执行程序段1。当常量a为0且常量b为真时,执行程序段2;当常量a为0且常量b为0时,执行程序段3)
#if constant a
...code1...
#else
#if constant b
...code 2...
#else
...code 3...
#endif
#endif
4.总结
欢迎关注我的公众号,回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
欢迎关注我的视频号:
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。