C 预处理器语言注意点
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) #str
NSLog(@"%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 加上所报警告。
感谢:
C 语言三种预处理功能
Clang Compiler User's Manual
C语言 ## VA_ARGS 宏

浙公网安备 33010602011771号