我想知道宏如何在Objective-C中工作,编译器如何解释它们,是什么使它们与常规函数不同。此外,他们如何在当前上下文中访问__LINE__
,__FILE__
,_cmd
和最好奇的self
(不将其传递给他们)?
答案 0 :(得分:5)
它们与纯C 中的工作方式相同。
宏由编译器的预处理器处理,因为编译器仍然拥有完整的源代码(以及封闭的__FUNCTION__
或当前__LINE__
的名称)。
您可以将宏视为某种先进的“文本替换”魔法。
使用宏,你基本上告诉编译器:“请将我的的宏替换为我用定义的源代码块,然后才能执行任何实际操作汇编强>“。
有关宏和C预处理器的更多信息,请查看此处:http://en.wikipedia.org/wiki/C_preprocessor
答案 1 :(得分:2)
宏与常规函数不同,因为它们被处理为 text 而非代码。
宏编译在编译器解析代码之前完成,并且与语言无关 - 无论目标语言如何,宏都被视为相同。该过程通常称为宏扩展,它发生在预处理期间。
__LINE__
和__FILE__
是由编译器定义的宏,因此它们只是被文本替换。宏可以“访问”_cmd
和self
当且仅当在扩展宏的上下文中存在这些变量时 - 宏才真正访问这些变量,宏正在展开,结果代码访问变量。
您可以通过在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语言的一部分。它们不是宏,只是不可见的参数。