美文网首页工作生活
IOS基础知识-宏定义使用

IOS基础知识-宏定义使用

作者: 程序员的自我救赎 | 来源:发表于2019-07-03 10:49 被阅读0次

写一个简单的宏定义:

 #define MIN(a,b) ((a) > (b) ? (a) : (b))

指令与作用:

#  空指令,无任何效果
#define  定义宏
#undef  取消已定义的宏
#if  如果给定条件为真,则编译下面代码
#ifdef  如果宏已经定义,则编译下面代码
#ifndef  如果宏没有定义,则编译下面代码
#elif  如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif  结束一个#if……#else条件编译块
#error  停止编译并显示错误信息

运算符:

例如: #define demo1(n) "123"#n
出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%s",demo1(abc));
}
//打印会输出 123abc

例如:#define demo2(m,n,j) m##n##j

##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%d",demo2(1, 2, 3));
}
//打印会输出 123

VA_ARGS 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。
实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ VA_ARGS _就可以被用在替换部分中,替换省略号所代表的字符串。比如:

#define PR(...) printf(__VA_ARGS__)
int main()
{
    int wt=1,sp=2;
    PR("hello\n");
    PR("weight = %d, shipping = %d",wt,sp);
    return 0;
}
输出结果: 
hello 
weight = 1, shipping = 2 
省略号只能代替最后面的宏参数。 
#define W(x,…,y)错误! 

注意:##__VA_ARGS__ 宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错
20180727111856842.png

宏定义的优缺点

优点

提高了程序的可读性,同时也方便进行修改,用户只需要在一处定义,多处使用,修改也只需要修改一处
提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率,如果有一个函数会在工程中频繁使用,可以考虑一下宏定义

缺点

由于是直接嵌入的,所以代码可能相对多一点
嵌套定义过多可能会影响程序的可读性,而且很容易出错;
对带参的宏而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。
预编译语句仅仅是简单的值代替,缺乏类型的检测机制

相关文章

  • IOS基础知识-宏定义使用

    写一个简单的宏定义: 指令与作用: 运算符: 例如: #define demo1(n) "123"#n出现在宏定义...

  • IOS NSLog宏定义

    IOS NSLog宏定义 标签(空格分隔): IOS IOS NSLog宏定义 宏定义NSLog方法,不用加";"...

  • iOS之宏定义

    iOS开发小技巧之--WeakSelf宏的进化 宏定义不是C语句,也无须使用分号结束 宏定义并不是变量,它甚至不是...

  • 关于extern引出的问题

    问题 项目中在.mm文件中使用宏: 报错: 解析 iOS的常量声明与定义 iOS中声明常量 定义常量 这个是iOS...

  • iOS-#if插入DEBUG宏定义介绍

    iOS-#if插入DEBUG宏定义介绍 一: OC使用#ifdef代码块 Swift使用#if DEBUG代码块 ...

  • iOS - 《系统宏》宏,预处理命令

    在ios中使用预处理命令[C语言的特殊命令] 1.宏定义 #define 与 #undef 2.带参数宏定义 3....

  • iOS 常用宏定义

    iOS 开发中使用一些常用宏定义可以大大提高开发效率,提高代码的重用性.以下是一些常用的宏定义: 像这些宏定义,在...

  • iOS开发 宏定义

    在iOS开发中,合理的使用宏定义可以使我们少些好多代码 C预定义宏DATE //进行预处理的日期(“Mmm dd...

  • iOS开发中常用的宏定义

    iOS开发中常用的宏定义 尺寸宏 打印宏 替换NSLog来使用,debug模式下可以打印很多方法名,行信息。 #...

  • iOS工程宏定义使用

    1. 区分 Debug 和 release 模式 工程区分 Debug 和 release 在 Build Set...

网友评论

    本文标题:IOS基础知识-宏定义使用

    本文链接:https://www.haomeiwen.com/subject/sirthctx.html