Objective-C中“宏”是什么意思?

时间:2013-12-30 10:27:24

标签: objective-c macros

我是iOS开发的新手,我只想知道Objective-C中宏的含义吗?

我发现“宏”与#define一起使用但仍未明白其含义。

http://www.saturngod.net/ios-macro-define-value-with-condition

4 个答案:

答案 0 :(得分:22)

是的, Larme 是对的。宏可以用于多种语言,它不是objective-c语言的专长。

宏是预处理器定义。这意味着在编译代码之前,预处理器会扫描您的代码,并且除了其他方面之外,还可以在宏看到宏名称的地方替换宏的定义。它没有比这更聪明的事情。

几乎是文字代码替换。 e.g .-

假设您希望方法返回最多两个数字。你编写一个宏来完成这个简单的任务:

#define MAX(x, y) x > y ? x : y

简单,对吧?然后在代码中使用宏,如下所示:

int a = 1, b = 2;
int result = 3 + MAX(a, b);

编辑:

问题是预编译器在编译之前将宏定义替换为代码,因此这是编译器看到的代码:

int a = 1, b = 2;
int result = 3 + a > b ? a : b;

C操作顺序要求在应用三元运算符之前计算和3 + a。您打算在结果中保存3 + 2的值,而是先添加3 + 1,然后测试总和是否大于2。因此结果等于2,而不是你预期的5。

因此,您可以通过添加一些括号来解决问题,然后重试:

#define MAX(x, y) ((x) > (y) ? (x) : (y))

答案 1 :(得分:5)

宏是代号的片段,它已被赋予名称。每当使用该名称时,它将被宏的内容替换。有两种宏。它们的区别主要在于它们在使用时的外观。类似对象的宏在使用时类似于数据对象,类似函数的宏类似于函数调用。

类似对象的宏是一个简单的标识符,它将被代码片段替换。它被称为类似对象,因为它看起来像是使用它的代码中的数据对象。它们最常用于为数字常量提供符号名称。

使用'#define'指令创建宏。 '#define'之后是宏的名称,然后是令牌序列,它应该是缩写,它被不同地称为宏的主体,扩展或替换列表。例如,

 #define BUFFER_SIZE 1024

将名为BUFFER_SIZE的宏定义为令牌1024的缩写。如果在此'#define'指令之后的某处出现了表单的Objective C语句

 foo = (char *) malloc (BUFFER_SIZE);

Objective C编译器将看到与编写

时相同的标记
 foo = (char *) malloc (1024);

您还可以定义其使用看起来像函数调用的宏。这些被称为类似函数的宏。要定义类似函数的宏,可以使用相同的'#define'指令,但是在宏名称后面紧跟一对括号。 喜欢:

#define isIphone([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)

#define GetImage(imageName) [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]     pathForResource:imageName ofType:@"png"]]

答案 2 :(得分:0)

维基百科在Macro下有答案。

<强>定义:

  

该术语起源于宏汇编程序,其目的是让程序员将一系列计算指令作为单个程序语句使用,使编程任务变得不那么繁琐且不易出错。

<强>用法:

使用应用程序的内置宏功能创建的键盘和鼠标宏有时称为应用程序宏。它们是通过执行一次序列并让应用程序记录操作来创建的。可能存在底层宏编程语言,最常见的是脚本语言,可直接访问应用程序的功能。

答案 3 :(得分:0)

宏是编译时常量。这意味着它们将在编译时替换为实际值。

#define MIN_VALUE 3 // Definition


if(x > MIN_VALUE) // Usage
{

}

虽然编译实际上看起来像

 if(x  > 3) // During compilation
  {

  }