0%

预处理命令之宏定义

这里不谈宏的使用。只是突然想知道定义一个宏之后,这个宏的作用域有多大。

宏定义作用域

C语言标准中宏定义的作用域是:如果是在块作用域内,则从定义位置开始,到块作用域结束,否则到其当前文件结尾,其他文件如果没有通过#include包含这个文件,则使用该宏是无效的。

比如我在a.m里面定义了一个宏#define kCondTrue 1,在b.m里面有如下代码:

1
2
3
4
5
6
7
- (void)btnDidClicked:(UIButton *)sender {
NSLog(@"btnDidClicked");

#if kCondTrue //不会有编译错误
NSLog(@"111");
#endif
}

由于kCondTrue宏对b.m是不可见的,所以这里不会打印111。

通常编译器会有一些预定义宏,预定义的宏大多会遵守命名规则:__xxx_yyy__,以双下划线开始和结束。比如__OBJC2__就是一个预定义的宏。

宏定义很强大,组合起来可以实现一个很复杂的功能。but 这样的宏可读性是很差的,你可以想象一下一个由十几个宏共同组合完成的宏有多么可怕,OC开源源码里面原子操作相关的宏是真滴恐怖。感觉如果一个宏过于复杂最好还是用方法代替。

完了。

参考

C 和 Objective-C中的 #ifdef #ifndef

宏定义的黑魔法 - 宏菜鸟起飞手册

觉得文章有帮助可以打赏一下哦!