3

Apple の多くの .h (プライベート API) を見てきました。ほとんどの変数 / 構造体 / 列挙型 / クラスには、接頭辞として _ があります。

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

@class NSString;

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

私の質問は、

アンダースコアとタイプ定義を適切なもので再度与える理由は何ですか?

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 {...} nameGCC 2.0 の時代までさかのぼります。前述のように、無名の構造体を持つことはできませんでした。

ivar の名前については、単一の先頭のアンダースコアは Apple の内部コーディング規則であり、公式に言えば、Apple は単一のアンダースコアで始まるすべての名前を予約しています。Apple がすべての ivar にそのように名前を付けている場合、そうしなければ、どの名前とも衝突することはありません。

残念なことに、多くのサンプル コード プロジェクトが Apple の開発者 Web サイトで公開されており、コードを調べたり、ivar 名の先頭のアンダースコアを削除したりしていません。これには 2 つの理由があります。主な理由は、Apple 内で働く開発者が変数にそのような名前を付ける習慣があることです。もう 1 つの理由は、サンプル コード プロジェクトをレビューしている人々が、標準コーディングの強制をあまり気にしていないことです。スタイル。

于 2009-12-02T08:40:58.363 に答える