C 预处理器语言注意点
iOS 中用到的预处理器语言:
- 预处理器指令(头文件包含、条件编译、诊断、#pragram 指令)
- 宏展开 (MACRO)
头文件常规注意点:
- 使用 "" 和 <> 引用头文件的区别:
- 前者编译器会先在存储源文件的目录中搜索该头文件。如果没找到则会去默认目录中搜索。(默认目录: 预先设置用于搜索系统标准头文件的目录)
- 后者是只会去默认目录中搜索。
- #import 相对于 #include 而言,可以确保头文件仅在源文件中被包含一次(防止递归包含)。
诊断常规使用:
- 主要是配合条件编译使用。
#ifdef FREE#define CHLog(x) NSLog(@"%@",x)#warning "define MARCO FREE"#else#define CHLog(x)#error "Release not define MACRO FREE"#endif
例子说明: FREE 是在 debug 下定义的宏,没有在 release 下定义。#warning 警告 debug 下定义了 FREE , #error 在 release 下判断是否定义了 FREE 。
宏定义常规注意点:
- 使用 #undef 可以结束之前定义的宏
- 宏定义容许嵌套
- 宏定义不分配内存
- 字符串 ("") 中永远不包含宏
- 使用反斜杠 换行
定义带参宏语法:
一般带参宏:
#define CHMax(a,b) a>b ? a : b使用 # 带参宏:
# 用于把宏定义中的参数变为 C 字符串(#@ 用于将参数变为 C 字符)#define CHStr(str) #strNSLog(@"%s",CHStr(123)); -> NSLog(@"%s","123");- 使用 ## 带参宏:
相当于一个连接符号#define CHName(name) [self iMock_##name][self CHName(log)]; -> [self iMock_log] 使用可变参数宏 __VA_ARGS__ :
如果我们想对打印语句进行条件编译,不使用__VA_ARGS__你会发现我们要写两个打印语句(NSLog() 参数可变):#define CHLog1(x) NSLog(x)#define CHLog2(a , b) NSLog(a , b)
我们使用可变参数宏(可以简单的理解为用 ... 替换__VA_ARGS__):#define CHLog3(...) NSLog(__VA_ARGS__)
还可以使用(如果可变参数传空,## 会帮你把实际调用语句中用于参数分隔的逗号去掉):#define CHLog4(a , ...) NSLog(a , ##__VA_ARGS__)推荐的调试打印写法(个人喜好):
#ifdef DEBUG#define CHLog(fmt, ...) NSLog((@"\nFUNC: %s ---- [Line %d] \n" fmt),__func__, __LINE__, ##__VA_ARGS__)#else#define CHLog(fmt, ...)#endif
#pragma特殊使用:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
int a;
#pragma clang diagnostic pop
例子说明: 我们申明一个未使用变量 a ,这时候编译器会给出一个警告(unused variable 'a')。我们可以使用上述命令来过滤掉这条不必要的警告。 ignored 后参数格式:-W 加上所报警告。




