Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在苹果的私有头文件中加下划线的原因是什么_Objective C_Foundation - Fatal编程技术网

Objective c 在苹果的私有头文件中加下划线的原因是什么

Objective c 在苹果的私有头文件中加下划线的原因是什么,objective-c,foundation,Objective C,Foundation,我看过很多苹果的.h(私有API)。大多数变量/结构/枚举/类的前缀都是uu #import <Foundation/NSValue.h> #import <Foundation/NSObjCRuntime.h> @class NSString; typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; #导入 #进口 @类NSString; 类型定义结构

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

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

@class NSString;

typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;
#导入
#进口
@类NSString;
类型定义结构_NSRange{
整数位置;
整数长度;
}NSRange;
我的问题是,


为什么要用正确的下划线和typedef再次标记它们?

它通常被用作标记,表明所讨论的实体是私有的和/或内部的,不应该直接在代码中使用。我认为在旧版本的C中,你不能声明一个匿名结构,因此你需要一个“filler”名称来放在那里。

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

Objective-C具有全局开放的名称空间。所有的名字都必须是唯一的,这一点很重要。除了前面给出的理由外,苹果保留所有下划线名称。这将有助于防止意外的名称冲突

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

对于IVAR的名称,单前导下划线是苹果公司内部的编码惯例,官方说法苹果公司保留所有以单下划线开头的名称。如果苹果公司用这种方式命名他们所有的IVAR,那么如果你不这么做,你就不会和他们的名字发生冲突


不幸的是,许多示例代码项目已经发布在苹果的开发者网站上,没有经过代码检查,也没有删除ivar名称上的主要下划线。出现这种情况有两个原因,一个主要原因是在苹果内部工作的开发人员习惯于这样命名他们的变量,另一个原因是审查示例代码项目的人并不真正关心强制执行标准的编码风格

除了问题中的形式不是不透明的。不透明性通常是通过使用typedef的void指针并将实际的结构定义保留在公共头之外来实现的。您可能是对的,因为某种原因,我假设他是在结合来自public/private的代码,因为他在谈论私有API。