开始之前,我先列出在开发工程中经常用到的部分预处理指令:
#define <#macro#> // 定义宏
#undef <#macro#> // 取消宏
#if <#condition#> // 如果给定的condition为真,则编译下面的代码
#ifdef <#macro#> // 如果宏已定义,则编译下面的代码
#ifndef <#macro#> // 如果宏没有被定义,则编译下面的代码
#elif <#condition#> // 如果前面的#if给定条件为假,当前的条件为真,则编译下面的代码
#endif // 结束一个#if...#else条件编译块
#error <#message#> // 停止编译并显示错误信息
一、宏中的运算符
在定义宏时,经常会出现的两个运算符 # 和 ##
#:出现在宏定义中的 # 运算符,会将其后面参数转化为一个字符串。我们把这种用法的称为字符串化运算符。
#define AXE__PASTE(x) "drift"#x
int main(int argc, const char * argv[]) {
@autoreleasepool {
printf("%s\n", AXE__PASTE(_Axe));
//-> drift_Axe
}
return 0;
}
##:常用于把多个参数连接在一起。NSX\_PASTE**(A,B) 是系统提供的一个宏,可自行查阅。
printf("%d\n",__NSX_PASTE__(95, 27));
//-> 9527
二、条件编译指令
-
#if指令用于检测后面的常量表达式,如果为真,则编译接下来的代码,直到出现#else、#elif、#endif为止;否则就不编译。 -
#endif指令用于终止#if预处理指令。
#define AXE_TAG 0
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 由于定义的 AXE_TAG 宏代表 0,#if 条件为假,不编译后面的代码,直到 #endif,最后只输出 BB。去掉 #define AXE_TAG 0 语句,效果也是一样的。
#if AXE_TAG
printf("AA\n");
#endif
printf("BB\n");
}
return 0;
}
#ifdef和#ifndef
#define _FBI_WARNING_
int main(int argc, const char * argv[]) {
@autoreleasepool {
/* START */
#ifdef _FBI_WARNING_
printf("YES\n");
#endif
#ifndef _FBI_WARNING_
printf("NO\n");
#endif
/*等价于*/
#if defined(_FBI_WARNING_)
printf("YES\n");
#endif
#if !defined(_FBI_WARNING_)
printf("NO\n");
#endif
/* END */
}
return 0;
}
#else指令
#define _FBI_WARNING_
int main(int argc, const char * argv[]) {
@autoreleasepool {
/* START */
#ifdef _FBI_WARNING_
printf("YES\n");
#else
printf("NO\n");
#endif
/* END */
}
return 0;
}
#elif指令
#elif 预处理指令综合了 #if 和 #else 指令的作用
#define _FBI_WARNING_
int main(int argc, const char * argv[]) {
@autoreleasepool {
/* START */
#ifdef _FBI_WARNING_
printf("YES\n");
#elif FBI_WARNING
printf("Unknown\n");
#else
printf("NO\n");
#endif
/* END */
}
return 0;
}
暂时先写到这里,以后碰到了再补充。