3

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

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

@class NSString;

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

我的问题是,

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

4

4 回答 4

7

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

于 2009-12-01T23:59:06.280 回答
2

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

于 2009-12-01T23:51:33.687 回答
1

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

于 2009-12-01T23:53:37.490 回答
1

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

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

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

于 2009-12-02T08:40:58.363 回答