16

プロジェクトで変数を使用する可能性のあるC++コードの可能性がある場合にのみ、UIKIT_EXTERNを使用すると思います。

この場合、UIKIT_EXTERN を使用して、外部で利用可能なすべての定数を宣言するだけで安全ではないでしょうか?

なぜこれ以上見ないのですか?

4

2 に答える 2

25

プロジェクトで変数を使用する可能性のあるC++コードの可能性がある場合にのみ、UIKIT_EXTERNを使用すると思います。

右。これが主な理由です。これは、C と C++ のシンボルが異なる命名規則を使用するために発生します。

あまり一般的ではない理由がありUIKIT_EXTERNます。デフォルトの可視性も指定します。

注: より一般的には、"シンボル" -- "変数" ではありません。これexternは、定数、関数などにも適用できるためです。

この場合、UIKIT_EXTERN を使用して、外部で利用可能なすべての定数を宣言するだけで安全ではないでしょうか?

簡単な回答: この形式を使用するのは良い習慣 (読み方: '安全') ですが、通常は、ライブラリで に相当するものを独自に宣言するのが最善ですUIKIT_EXTERN


UIKIT_EXTERNUIKit宣言です。ライブラリはこの宣言に依存するべきではなく、独自のシノニムを定義するだけです。多くのライブラリはそうしていますが、C および C++ でより一般的であることがわかりました。これらのプログラムは、多くの場合、より多くのプラットフォームを対象としており、iOS プログラムのかなりの割合がサポートするように開発されていないためです。他のプラットフォーム。そうしないと、UIKit を必要としない Objective-C プログラムは、この宣言のために UIKit に依存する可能性があるため、UIKit をインポートする必要があります (UIKIT_EXTERN宣言が表示されるように)。

さらに、UIKit は、iOS プログラムを実行できるすべてのプラットフォーム (つまり、C、C++、または Foundation に依存し、OS X に移植可能) で使用できるわけではありません。したがって、誰かが (不思議なことに) 自分自身を宣言するのは悪い考えだと主張したCF_EXPORTとしても、C、C++、および OS X でも使用できるため、(CoreFoundation の同等のもの) を選択する方が移植性の高いオプションになります。 (最低限) CoreFoundation を含めます。

ライブラリが UIKit に依存しており、フレームワークをライブラリにインポートする必要がある場合、それらのシノニムを使用してもライブラリに問題が発生する可能性はほとんどありません。

しかし、これは非常に大きな条件のセットです。ライブラリで独自の を宣言するのは非常に簡単です。要するに、適切に作成された移植可能なライブラリは (ほとんど) 'raw'externを使用すべきではなく、不必要なライブラリの依存関係も良いことではありません (この場合は UIKit)。

サブクラスのコレクションなど、ライブラリが UIKit から分離できない場合をUIKIT_EXTERN 除き、これを使用するのは設計上適切ではありません。UIView

ライブラリが Foundation 型のみを扱う場合、UIKit をインポートすると、(UIKit インポートが削除されるまで) OS X でライブラリが (不必要に) 使用できなくなります。

C (スーパーセットを含む) で C++ を使用した経験があまりない人は、シンボル名が異なることを知らない可能性があるため、extern直接使用するだけかもしれません。最後に、一部のプログラムは当初、C および/または Objective-C の翻訳以外で使用するように設計されていなかったexternため、翻訳の条件付き装飾なしで単純に使用された可能性があります。

最後に、次のUIKIT_EXTERNように指定されているため、期待/望んでいることを正確に実行できない場合があります。

  • 外部 C シンボル
  • デフォルトの可視性を持つ

ObjC の翻訳に表示されるライブラリ シンボルの場合、これは完璧です。

于 2013-07-16T06:12:47.300 に答える
2

主に、現在のライブラリ/実行可能ファイルの外部でクラスを表示できるようにすることです。ライブラリを開発している場合を除き、これを使用する必要はないでしょう。

ご指摘のとおり、マクロを使用する主な利点は、追加の C++extern保護が組み込まれていることです。したがって、実際にライブラリを開発している場合、これは間違いなく良い考えです (そうでない場合、呼び出し元は認識してextern C宣言を追加する必要があります) 。 .

これについては、次の ADC ドキュメントで説明されています。

ここでかなりよく答えられています:

于 2013-07-16T04:36:29.650 に答える