这个不是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开发常用宏定义 提高代码重用性
定义了一些常用的宏,写代码的时候用起来挺方便的,添加了pch文件,设置了相对路径;设置pch文件相对路径的方法: 设置PCH的相对路径 要想设置PCH的相对路径,首先我们需要去查看绝对路径。 相对路径 点击PCH...
"iOS常用宏定义framework" 提供了一系列预定义的宏和常用类别方法,旨在提高开发效率并简化代码。下面我们将深入探讨这个框架中的关键知识点。 1. **宏定义(Macro Definitions)**: - 宏定义是C语言的一种预...
#pragma mark - UIColor宏定义 #pragma mark - 屏幕适配 #pragma mark - IOS版本信息 #pragma mark - 切圆 #pragma mark - 边框
本文将详细介绍一些常用的iOS宏定义,包括UI元素尺寸、日志输出、系统信息获取等方面。 1. UI元素尺寸宏定义: - `NAVIGATIONBAR_HEIGHT`:定义导航栏的高度,通常为44像素。 - `STATUSBAR_HEIGHT`:定义状态栏的...
//NavBar高度 #define NavigationBar_HEIGHT 44 //获取屏幕 宽度、高度 #define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width) #define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height) ...
为了使代码更适应不同需求,你可以根据项目需求调整宏定义,比如添加对条形码的支持,或者自定义扫描区域等。此外,如果需要显示实时预览,你还需要创建一个AVCaptureVideoPreviewLayer并将其添加到视图层上。 通过...
本文将详细解释为什么不应在iOS开发中使用宏定义常量,并介绍更安全、更规范的替代方案。 首先,宏定义并不是真正的常量,而是预处理器指令。这意味着在编译阶段,宏会被其定义的内容替换,可能导致意外的结果。...
在iOS开发过程中,宏定义(Macro Definitions)是Objective-C编程中一种常见的技术,它允许开发者在编译时进行代码替换,提高代码的可读性和可维护性。`Macro-master`这个压缩包文件很可能是包含了一些常用的宏定义...
这个压缩包“iOS开发工具类汇总”显然提供了一组实用的宏定义,旨在简化iOS应用程序的开发过程,提高开发效率。其中包含的“CoreEditText-master”可能是一个专门针对文本编辑的工具库。 `CoreEditText-master`很...
在iOS开发中,Objective-C(简称OC)是主要的编程语言之一,用于构建Apple平台的应用程序。在开发过程中,我们经常需要获取设备的...正确使用宏定义,可以帮助我们更好地适应iOS设备的屏幕变化,提供优秀的用户体验。
iOS 单例模式的完整使用实例及销毁宏定义 在 iOS 开发中,单例模式是一种非常常用的设计模式,用于提供全局访问的共享资源。下面,我们将详细介绍 iOS 单例模式的完整使用实例及其销毁宏定义。 一、单例模式的概念...
在iOS开发中,宏定义(Macro Definitions)是Objective-C编程中一种常见的技术,它允许开发者预定义代码片段,提高代码的可读性和可维护性。`YCDefine` 是一个开源项目,专门收集并整理了iOS项目中常用的宏定义,...
2. 宏定义(Macro Definition):为了简化代码和提高可读性,开发者有时会创建宏定义来快速生成颜色。这可能是描述中提到的“俩种宏定义”的一种。例如,你可以创建如下的宏定义: ```objc #define RGB_COLOR(r, g, ...
3.代码中有常用宏定义. 4.分类和宏定义中有很多强大及方便的快捷方法. 5.更多详细方法和宏定义内容请参考代码,希望对你有所帮助. 6.可以使用cocodPods platform :ios, ‘7.0’ target :’Test’ do pod ...
这篇文档将深入探讨这两种模式以及它们在实际项目中的应用,并通过SingletonTemplate这个xcode工程中的实例来阐述宏定义和使用。 首先,让我们理解什么是ARC。ARC是Xcode 4.2引入的一个特性,它自动跟踪对象的生命...
其中,UIFont 类用于设置文字的字体和大小,而 KFacialSizeWidth 和 KFacialSizeHeight 两个宏定义用于设置表情的大小。 在实际应用中,开发者可以使用该机制来实现各种图文混排的功能,例如实现聊天应用程序中的...