这里不谈宏的使用。只是突然想知道定义一个宏之后,这个宏的作用域有多大。
宏定义作用域
C语言标准中宏定义的作用域是:如果是在块作用域内,则从定义位置开始,到块作用域结束,否则到其当前文件结尾,其他文件如果没有通过#include包含这个文件,则使用该宏是无效的。
比如我在a.m里面定义了一个宏#define kCondTrue 1
,在b.m里面有如下代码:
1 | - (void)btnDidClicked:(UIButton *)sender { |
由于kCondTrue宏对b.m是不可见的,所以这里不会打印111。
通常编译器会有一些预定义宏,预定义的宏大多会遵守命名规则:__xxx_yyy__
,以双下划线开始和结束。比如__OBJC2__
就是一个预定义的宏。
宏定义很强大,组合起来可以实现一个很复杂的功能。but 这样的宏可读性是很差的,你可以想象一下一个由十几个宏共同组合完成的宏有多么可怕,OC开源源码里面原子操作相关的宏是真滴恐怖。感觉如果一个宏过于复杂最好还是用方法代替。
完了。