【问题标题】:What is the reason behind giving Underscore in private header files of apple在苹果的私有头文件中给出下划线的原因是什么
【发布时间】:2009-12-01 23:44:05
【问题描述】:

我见过很多苹果的 .h(私有 API)。大多数变量/结构/枚举/类都有_作为前缀。

#import <Foundation/NSValue.h>
#import <Foundation/NSObjCRuntime.h>

@class NSString;

typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;

我的问题是,

使用正确的下划线和 typedef 再次给出它们的原因是什么?

【问题讨论】:

    标签: objective-c foundation


    【解决方案1】:

    Objective-C 有一个全局开放的名称空间。重要的是所有名称都是唯一的。除了前面给出的原因,Apple 为自己保留所有下划线名称。这将有助于防止意外的名称冲突。

    【讨论】:

      【解决方案2】:

      它通常用作相关实体是私有和/或内部实体的标志,不应直接在您的代码中使用。我认为在旧版本的 C 中,您不能声明匿名结构,因此您需要一个“填充”名称。

      【讨论】:

        【解决方案3】:

        我相信这是为了创建一个opaque type。这限制了该类型的客户端在不使用提供的接口的情况下访问内部详细信息。然后,您可以通过opaque pointer 使用该结构,并且可以声明该类型的数组、变量等,而无需担心内部实现,确保如果 Apple 决定更改这些类型背后的代码,则无需重新编译软件.

        【讨论】:

        • 除了问题中的表格不是不透明的。不透明度通常是通过使用 typedef 的 void 指针并将实际结构定义保留在公共标头之外来实现的。
        • 您可能是对的,出于某种原因,我认为他正在组合公共/私有代码,因为他在谈论私有 API。
        【解决方案4】:

        对于声明结构,声明 typedef struct _name {...} name 的风格可以追溯到 GCC 2.0 左右的时代,正如上面提到的那样,你不能拥有匿名结构。

        对于 ivars 的名称,单个前导下划线是 Apple 内部编码约定,正式而言 Apple 保留所有以单个下划线开头的名称。如果 Apple 以这种方式命名他们所有的 ivars,那么如果你不这样做,你就不会与他们的任何名字发生冲突。

        不幸的是,许多示例代码项目已在 Apple 的开发人员网站上发布,而没有仔细检查代码并删除 ivar 名称上的前导下划线。发生这种情况有两个原因,主要是在 Apple 内部工作的开发人员习惯以这种方式命名他们的变量,另一个原因是审查示例代码项目的人并不太关心执行标准编码风格。

        【讨论】:

          猜你喜欢
          • 2021-11-30
          • 2019-11-05
          • 2021-02-14
          • 1970-01-01
          • 2016-04-06
          • 1970-01-01
          • 2011-08-19
          • 2013-05-20
          相关资源
          最近更新 更多