1.宏定义需要加括号的两种情况:
(1)如果宏的替换列表中带有运算符,那么使用要将替换列表放到括号中。例如#define MAX_VALUE(X,Y) ((X) > (Y) ? (X) : (Y))
(2)如果宏有参数,每次参数在替换列表中出现时都要放在括号中。同上
#define MAX_VALUE(X,Y) ((X) > (Y) ? (X) : (Y))// 求两个数中的最大值
2.#运算符和##运算符
(1)出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符。例如:
#define PASTE(n) "adhfkj"#n
main()
{
printf("%s\n",PASTE(15));
}
宏定义中的#运算符告诉预处理程序,把源代码中任何传递给该宏的参数转换成一个字符串。所以输出应该是adhfkj15。
针对Window,dos,os2不同的系统对WIDTH进行不同的定义
单独一行的#是空指令
#ifdef WINDOWS
#
#define WIDTH 375
#
#elif defined(DOS)
#
#define WIDTH 414
#
#elif defined(OS)
#
#define WIDTH 320
#
#else
#
//#error no sysytem;
#
#endif
(2)##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。看下面的例子:
#define NUM(a,b,c) a##b##c
#define STR(a,b,c) a##b##c
main()
{
printf("%d\n",NUM(1,2,3));
printf("%s\n",STR("aa","bb","cc"));
}
最后程序的输出为:
123
aabbcc
#define IMAGE_NAME(NAME) @"image_name"#NAME // IMAGE_NAME(3)=image_name3
#define STR(NAME,AGE,SEX) @"名字:"#NAME@".年龄:"#AGE@".性别:"#SEX// 名字:@“王五".年龄:24.性别:@"男"
3.取消宏定义
#undef NUM1
4.复杂宏的定义
#define NSLOG_ARRAY_OR_DICT(ARRAY,DICT) (NSLog(@"array = %@,dict = %@",[(ARRAY) description],[(DICT) description]));
//设计技巧:dowhile中出现;
#define NSLOG_ARRAY_OR_DICT2(ARRAY,DICT) do {int a =1;NSLog(@"a = %d",a);NSLog(@"array = %@,dict = %@",[(ARRAY) description],[(DICT) description]);}while(0)
5.条件编译args...表示有多个参数
(1)打印信息
#define DEBUG1
#if DEBUG
#define MY_NSLog(fmt,args...) NSLog(@fmt,##args)
#else
#d
iOS宏定义
最新推荐文章于 2020-09-05 14:20:31 发布
本文详细探讨了iOS开发中宏定义的概念、使用场景及其优缺点,包括预处理器宏的定义、条件编译和常见宏技巧。通过实例解析,帮助开发者更好地掌握宏在iOS项目中的应用。
摘要由CSDN通过智能技术生成