宏如何在Objective-C中工作?

时间:2011-04-15 18:59:25

标签: objective-c

我想知道宏如何在Objective-C中工作,编译器如何解释它们,是什么使它们与常规函数不同。此外,他们如何在当前上下文中访问__LINE____FILE___cmd和最好奇的self(不将其传递给他们)?

4 个答案:

答案 0 :(得分:5)

它们与纯C 中的工作方式相同。

宏由编译器的预处理器处理,因为编译器仍然拥有完整的源代码(以及封闭的__FUNCTION__或当前__LINE__的名称)。 您可以将宏视为某种先进的“文本替换”魔法。

使用宏,你基本上告诉编译器:“请将我的的宏替换为我用定义的源代码块,然后才能执行任何实际操作汇编“。

有关宏和C预处理器的更多信息,请查看此处:http://en.wikipedia.org/wiki/C_preprocessor

答案 1 :(得分:2)

宏与常规函数不同,因为它们被处理为 text 而非代码

宏编译在编译器解析代码之前完成,并且与语言无关 - 无论目标语言如何,宏都被视为相同。该过程通常称为宏扩展,它发生在预处理期间。

__LINE____FILE__是由编译器定义的宏,因此它们只是被文本替换。宏可以“访问”_cmdself当且仅当在扩展宏的上下文中存在这些变量时 - 宏才真正访问这些变量,宏正在展开,结果代码访问变量。

您可以通过在XCode的构建菜单中选择预处理来查看宏处理的效果。

这是一个(奇怪的)示例:

#define BEGIN {
#define END }

int main(int argv, char *argv[])
BEGIN
    ... // body of main
END

扩展到更常见的:

int main(int argv, char *argv[])
{
    ... // body of main
}

答案 2 :(得分:0)

这些是在C语言标准中指定的,并且对它们的支持内置于编译器中。有关可用标准宏的更长列表,请参阅http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

答案 3 :(得分:0)

__LINE____FUNCTION__由编译器提供,并在预处理期间进行扩展。 self_cmd是隐式传递给每个ObjC方法的参数,是Objective-C语言的一部分。它们不是宏,只是不可见的参数。