【问题标题】:What are the pros and cons of macros (#define) in objective C?Objective C 中宏(#define)的优缺点是什么?
【发布时间】:2012-08-21 09:02:58
【问题描述】:

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

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

【问题讨论】:

标签: iphone objective-c macros


【解决方案1】:

#define 用于:

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

对于其他一切,有一个替代方案可以让您一路走好。

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

不——那是可怕的 :)

缺点

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

【讨论】:

  • 谢谢贾斯汀,如果你能指出替代方案,这将非常有帮助。
  • @rptwsthi 函数、内联函数、枚举、常量、typedef——你还需要什么替代品?
  • 注意,如果你使用#import,你就不需要header include guards
  • @PauldeLange true (+1),但是对于 C 和 C++ 文件使用 #include 仍然是惯用的,在这种情况下,您将拥有保护。将添加该详细信息。
【解决方案2】:

#define 是一个预处理器宏。您不要在类中创建宏,因为宏在使用时会在文本上进行扩展,但它的定义不是类的一部分,即使您碰巧在类中按词法编写它。

另外你不要import一个类在其他类中,你import这个类的声明头。即使您多次指定导入,每个编译单元也只会发生一次。因此,每个编译单元中的每个宏最多仍然有一个声明,并且由于宏只是预处理器,它只会在编译的早期阶段出现。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多