`
119568242
  • 浏览: 426895 次
  • 性别: Icon_minigender_1
  • 来自: 深圳/湛江
社区版块
存档分类
最新评论

[ios]宏定义

 
阅读更多

这个不是Ios 应该算是C里面的

http://baike.baidu.com/view/2076445.htm

宏定义

 

 

 

宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。[1]

编辑本段参数

 

不带参数

宏定义又称为宏代换、宏替换,简称“宏”。

格式:

#define标识符字符串

其中的标识符就是所谓的符号常量,也称为“宏名”。

预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。

掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。

即在对相关命令或语句的含义和功能作具体分析之前就要换:

例:

#definePI3.1415926

把程序中出现的PI全部换成3.1415926

说明:

(1)宏名一般用大写

(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义

(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。

(4)宏定义末尾不加分号;

(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。

(6)可以用#undef命令终止宏定义的作用域

(7)宏定义允许嵌套

(8)字符串" "中永远不包含宏

(9)宏定义不分配内存,变量定义分配内存。

(10)宏定义不存在类型问题,它的参数也是无类型的。[2]

带参数

除了一般的字符串替换,还要做参数代换

格式:

#define宏名(参数表) 字符串

例如:#defineS(a,b) a*b

area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;

类似于函数调用,有一个哑实结合的过程:

(1)实参如果是表达式容易出问题

#defineS(r) r*r

area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;

正确的宏定义是#defineS(r) ((r)*(r))

(2)宏名和参数的括号间不能有空格

(3)宏替换只作替换,不做计算,不做表达式求解

(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存

(5)宏的哑实结合不存在类型,也没有类型转换。

(6)函数只有一个返回值,利用宏则可以设法得到多个值

(7)宏展开使源程序变长,函数调用不会

(8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)[3]

编辑本段冷门重点

 

#define用法

1、 用无参宏定义一个简单的常量

#defineLEN 12

这个是最常见的用法,但也会出错。

比如下面几个知识点你会吗?可以看下:

(1)#defineNAME "zhangyuncong"

程序中有"NAME"则,它会不会被替换呢?

(2)#define0x abcd

可以吗?也就是说,可不可以用不是标识符的字母替换成别的东西?

(3)#defineNAME "zhang

这个可以吗?

(4)#defineNAME "zhangyuncong"

程序中有上面的宏定义,并且,程序里有句:

NAMELIST这样,会不会被替换成"zhangyuncong"LIST

四个题答案都是十分明确的。

第一个,""内的东西不会被宏替换。这一点应该大都知道。

第二个,宏定义前面的那个必须是合法的用户标识符

第三个,宏定义也不是说后面东西随便写,不能把字符串的两个""拆开。

第四个:只替换标识符,不替换别的东西。NAMELIST整体是个标识符,而没有NAME标识符,所以不替换。

也就是说,这种情况下记住:#define第一位置第二位置

(1) 不替换程序中字符串里的东西。

(2) 第一位置只能是合法的标识符(可以是关键字)

(3) 第二位置如果有字符串,必须把""配对。

(4) 只替换与第一位置完全相同的标识符

还有就是老生常谈的话:记住这是简单的替换而已,不要在中间计算结果,一定要替换出表达式之后再算。

2、 带参宏一般用法

比如#defineMAX(a,b) ((a)>(b)?(a):(b))

则遇到MAX(1+2,value)则会把它替换成:

((1+2)>(value)?(1+2):(value))

注意事项和无参宏差不多。

但还是应注意

#defineFUN(a) "a"

则,输入FUN(345)会被替换成什么?

其实,如果这么写,无论宏的实参是什么,都不会影响其被替换成"a"的命运。

也就是说,""内的字符不被当成形参,即使它和一模一样。

那么,你会问了,我要是想让这里输入FUN(345)它就替换成"345"该怎么实现呢?

请看下面关于#的用法

3、 有参宏定义中#的用法

#defineSTR(str) #str

#用于把宏定义中的参数两端加上字符串的""

比如,这里STR(my#name)会被替换成"my#name"

一般由任意字符都可以做形参,但以下情况会出错:

STR())这样,编译器不会把“)”当成STR()的参数。

STR(,)同上,编译器不会把“,”当成STR的参数。

STR(A,B)如果实参过多,则编译器会把多余的参数舍去。(VC++2008为例)

STR((A,B))会被解读为实参为:(A,B),而不是被解读为两个实参,第一个是(A第二个是B)。

4、 有参宏定义中##的用法

#defineWIDE(str) L##str

则会将形参str的前面加上L

比如:WIDE("abc")就会被替换成L"abc"

如果有#defineFUN(a,b) vo##a##b()

那么FUN(id ma,in)会被替换成void main()

5、 多行宏定义:

#definedoit(m,n) for(int i=0;i<(n);++i)\

{\

m+=i;\

}

分享到:
评论

相关推荐

    iOS 宏定义

    iOS 开发常用的宏定义大全

    iOS开发常用宏定义

    iOS开发常用宏定义 提高代码重用性

    ios-iOS 开发 - 常用宏定义大全.zip

    定义了一些常用的宏,写代码的时候用起来挺方便的,添加了pch文件,设置了相对路径;设置pch文件相对路径的方法: 设置PCH的相对路径 要想设置PCH的相对路径,首先我们需要去查看绝对路径。 相对路径 点击PCH...

    iOS常用宏定义framework

    "iOS常用宏定义framework" 提供了一系列预定义的宏和常用类别方法,旨在提高开发效率并简化代码。下面我们将深入探讨这个框架中的关键知识点。 1. **宏定义(Macro Definitions)**: - 宏定义是C语言的一种预...

    ios颜色屏幕版本切圆边框宏定义

    #pragma mark - UIColor宏定义 #pragma mark - 屏幕适配 #pragma mark - IOS版本信息 #pragma mark - 切圆 #pragma mark - 边框

    iOS中常用的宏定义总结

    本文将详细介绍一些常用的iOS宏定义,包括UI元素尺寸、日志输出、系统信息获取等方面。 1. UI元素尺寸宏定义: - `NAVIGATIONBAR_HEIGHT`:定义导航栏的高度,通常为44像素。 - `STATUSBAR_HEIGHT`:定义状态栏的...

    ios - A-常用宏定义

    //NavBar高度 #define NavigationBar_HEIGHT 44 //获取屏幕 宽度、高度 #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width) #define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height) ...

    ios-苹果原生二维码扫描 3行代码.zip

    为了使代码更适应不同需求,你可以根据项目需求调整宏定义,比如添加对条形码的支持,或者自定义扫描区域等。此外,如果需要显示实时预览,你还需要创建一个AVCaptureVideoPreviewLayer并将其添加到视图层上。 通过...

    谈谈为何iOS开发别用宏来定义常量

    本文将详细解释为什么不应在iOS开发中使用宏定义常量,并介绍更安全、更规范的替代方案。 首先,宏定义并不是真正的常量,而是预处理器指令。这意味着在编译阶段,宏会被其定义的内容替换,可能导致意外的结果。...

    iOS开发中常用的一些宏定义.zip

    在iOS开发过程中,宏定义(Macro Definitions)是Objective-C编程中一种常见的技术,它允许开发者在编译时进行代码替换,提高代码的可读性和可维护性。`Macro-master`这个压缩包文件很可能是包含了一些常用的宏定义...

    iOS开发工具类汇总,包含各种常用功能,用简单的宏定义使iOS开发简单、快捷、高效.zip

    这个压缩包“iOS开发工具类汇总”显然提供了一组实用的宏定义,旨在简化iOS应用程序的开发过程,提高开发效率。其中包含的“CoreEditText-master”可能是一个专门针对文本编辑的工具库。 `CoreEditText-master`很...

    (OC)获取屏幕间距-宏定义

    在iOS开发中,Objective-C(简称OC)是主要的编程语言之一,用于构建Apple平台的应用程序。在开发过程中,我们经常需要获取设备的...正确使用宏定义,可以帮助我们更好地适应iOS设备的屏幕变化,提供优秀的用户体验。

    ios 单利的完整使用实例 及销毁 宏定义

    iOS 单例模式的完整使用实例及销毁宏定义 在 iOS 开发中,单例模式是一种非常常用的设计模式,用于提供全局访问的共享资源。下面,我们将详细介绍 iOS 单例模式的完整使用实例及其销毁宏定义。 一、单例模式的概念...

    YCDefine, iOS项目中常用到的宏整理,使用方便快捷。.zip

    在iOS开发中,宏定义(Macro Definitions)是Objective-C编程中一种常见的技术,它允许开发者预定义代码片段,提高代码的可读性和可维护性。`YCDefine` 是一个开源项目,专门收集并整理了iOS项目中常用的宏定义,...

    ios-色值.zip

    2. 宏定义(Macro Definition):为了简化代码和提高可读性,开发者有时会创建宏定义来快速生成颜色。这可能是描述中提到的“俩种宏定义”的一种。例如,你可以创建如下的宏定义: ```objc #define RGB_COLOR(r, g, ...

    ios-基于AFNetworking3.1.0简单封装的GET,POST.zip

    3.代码中有常用宏定义. 4.分类和宏定义中有很多强大及方便的快捷方法. 5.更多详细方法和宏定义内容请参考代码,希望对你有所帮助. 6.可以使用cocodPods platform :ios, ‘7.0’ target :’Test’ do pod ...

    ARC和非ARC模版宏定义和使用

    这篇文档将深入探讨这两种模式以及它们在实际项目中的应用,并通过SingletonTemplate这个xcode工程中的实例来阐述宏定义和使用。 首先,让我们理解什么是ARC。ARC是Xcode 4.2引入的一个特性,它自动跟踪对象的生命...

    IOS实现图文混排

    其中,UIFont 类用于设置文字的字体和大小,而 KFacialSizeWidth 和 KFacialSizeHeight 两个宏定义用于设置表情的大小。 在实际应用中,开发者可以使用该机制来实现各种图文混排的功能,例如实现聊天应用程序中的...

Global site tag (gtag.js) - Google Analytics