【问题标题】:What is #ifdef __OBJC__ doing and why libraries listed below?#ifdef __OBJC__ 在做什么以及为什么下面列出的库?
【发布时间】:2011-10-12 07:20:01
【问题描述】:

我相信#ifdef __OBJC__ 指令确保我只为Objective-C 导入以下类库。在ifdef 语句之后列出类库的目的是什么?这个代码示例不是有点违背目的吗?

#ifdef __OBJC__
#import <foundation/foundation.h>
#import <uikit/uikit.h>
#import <coredata/coredata.h>
#endif
</coredata/coredata.h></uikit/uikit.h></foundation/foundation.h>

【问题讨论】:

  • 你从哪里得到这个代码?大写完全不可靠,看起来必须缺少指令。
  • #import 不导入库,它导入标头。与标头相关的库(本例中为框架)链接到其他地方。

标签: objective-c ios ios4 import conditional-compilation


【解决方案1】:

Objective-C 是 C 的超集(就像 C++ 一样),来自不同语言的文件经常会在同一个项目中使用并共享标头,尤其是前缀标头。 #ifdef __OBJC__#ifdef __cplusplus 类似,允许您仅包含适当语言的(或用于 Objective-C 的 #import)标头。

.c、.cpp 和 .m 文件中包含的相同标头(使用默认编译器设置)只会为 .m 文件定义 __OBJ__

【讨论】:

    【解决方案2】:

    如果您使用的是 Objective C,基本上在该代码中,它将导入这 3 个库

    #import <foundation/foundation.h>
    #import <uikit/uikit.h>
    #import <coredata/coredata.h>
    

    if, 的目的是除非必要,否则不要导入它们。

    【讨论】:

      【解决方案3】:

      它们列在#endif 之后只是为了提醒,因此它使代码更易于阅读。否则,您必须在上方查看#endif 的结尾。

      【讨论】:

        【解决方案4】:

        这样做的原因是,该代码仍然可以与可能想要使用该 C 文件中的功能的常规 C 代码兼容(至少在我看来是这样)。通过仅在定义 OBJC 时包含这些库,可以确保仅在为目标 c 而不是标准 C 编译时导入这些库。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-16
          • 2016-04-14
          • 2015-05-22
          • 2019-03-23
          • 2018-01-07
          • 2012-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多