宏定义
#define 宏名 值
例如:
#define PI 3.1415926
注意:要是宏定义的值中有
+
、-
一定要用括号括起来,防止在代码上下文中出现运算优先级错误
#define A 3+2
A*2 等价于 3+2*2
实际我们想要的是 (3+2)*2
所以宏定义要这样写
#define A (3+2)
宏定义函数
我们可以给宏添加参数
#define 宏名(参数1,参数2...) 值(参数1,参数2...)
例如:
这是格式化打印字符串的宏定义打印函数
#define NSLOG_Str(mark,str) NSLog(@"##%@##--str:%@--",(mark),(str))
- 换行
如果我们的函数很长需要换行的话可以这样写:
#define NSLOG_Str(mark,str)\
if (str) {\
NSLog(@"##%@##--str:%@--",(mark),(str));\
}
\
为了屏蔽换行符,从而起到换行作用
- 字符串转换
#define NSLOG_IF_Condition(Condition)\
if (Condition){\
fprintf(stderr, "提示:" #Condition "条件成立\n");\
}
调用:
int a = 0;
NSLOG_IF_Condition(a==0);
被解析为
if (a==0){
fprintf(stderr, "提示:" "a==0" "条件成立\n");
}
#Condition
是字符串化操作
取消宏定义
#undef 宏名
例如:
#undef PI
补充
今天早晨上班的路上看了一篇关于错误使用宏定义的博文,在这里补充一下。
#define B @"60"
if (false) {
#define B @"80"
}
NSLog(B);
看起来#define B @"80"
这句代码永远都不会执行,但是预处理命令和常量是不同的,在编译时期编译器会编译这段代码,这个时候编译器就会将B
替换成@"80"
,所以最后的输出结果是80。
版权声明:出自MajorLMJ技术博客的原创作品 ,转载时必须注明出处及相应链接!