目标C中宏(#define)的优缺点是什么?

时间:2012-08-21 09:02:58

标签: iphone objective-c macros

我想知道宏是否只有任何编程语言的优点。由于必须有限制,我们可以创建宏,并使用频率。

假设我们在一个类中创建100个宏并将其导入100个应用程序项目类中。这是一种正确的方法吗?

2 个答案:

答案 0 :(得分:2)

#define对以下内容非常有用:

  • 标题包含C和C ++标题的保护(idiom:#include C和C ++标题,#import ObjC标题)
  • 语言兼容性的条件编译(例如UIKIT_EXTERN),必须在预处理期间解决。
  • 平台/编译器/版本特定声明的条件编译(例如NS_AVAILABLE_IOS()),必须在预处理期间解析。
  • 断言宏。指定文件,行和表达式等信息太嘈杂且容易出错。

对于其他一切,有一种替代方案可以帮助您避免头痛。

  

假设我们在一个类中创建100个宏并将其导入100个应用程序项目类中。这是一种正确的方法吗?

不 - 那是可怕的:)

<强>缺点

有很多。很多时候,人类和程序(编译器,解析器,索引器)都很难理解程序。这是引入错误的好方法,并完全替换不相关程序的文本(通过简单的#import)。几乎所有东西都有更多的现代替代品(例如函数,内联,typedef,常量,枚举) - 让编译器让你的生活更轻松!

答案 1 :(得分:2)

#define是预处理器宏。你没有在类中创建宏,因为宏在使用时是文本扩展的,但它的定义不是类的一部分,即使你碰巧在类中用词法编写它。

另外,你没有import其他类中的类,你import类声明标题。即使您多次指定,每个编译单元也只会发生一次导入。因此,每个编译单元中每个宏最多只能有一个声明,因为宏只是预处理器,所以它只会在编译的早期阶段出现。

您并不是说您想要使用宏的确切内容,因此很难说它们是否是最适合您的解决方案,或者您是否有更好的选择。但我不担心他们的人数。标准头文件定义了数百个宏。