2

Apple は、すべてのフレームワーク クラスのヘッダーで次のコードを使用します。

#if !defined(__COREFOUNDATION_CFARRAY__)
#define __COREFOUNDATION_CFARRAY__ 1
...
#endif

これは、フレームワークで使用するクラスまたはカテゴリを設計するときに、「重複シンボル」リンカ エラーを排除するための推奨されるアプローチですか、それとも cの#include代わりに使用することからの保護が残っていますか?#import

これに関する調査により、インクルードガードに関するこの記事にたどり着きました

注: この質問は、シンボルの重複エラーを修正する方法を尋ねているのではなく、プロジェクトに複数回含まれている場合に、独自のコードが問題を引き起こすのを防ぐ方法があるかどうかを尋ねています。

4

2 に答える 2

3

インクルード ガードについては正しいです。おそらく、ソースから削除されていない互換性の理由があります。

ただし、これはシンボルの重複をあまり防げません。

例えば、

2 つのサードパーティ ライブラリがあり、それぞれが SBJSON ライブラリを使用している場合はどうなるでしょうか (数週間前に同僚にこれが発生しました)。

各ライブラリは個別にコンパイルされたため、それらの観点から、SBJSON は 1 回だけ含まれていました。ただし、アプリをリンクするようになったとき、シンボルが重複していたためできませんでした。

.a ライブラリ ファイルの 1 つからシンボルを手動で削除して、これを解決する必要がありました (このリンクは、非常に一般的な問題であることを示しています!)

編集:このリンクは、問題に対する段階的な解決策をより明確に示しています

于 2012-09-05T09:17:51.933 に答える
1

Apple は、すべてのフレームワーク クラスのヘッダーで次のコードを使用します。

ObjC API の場合は必ずしもそうではありません。しかし、CoreFoundation では、インクルード ガードを使用しています。多くの陣営では、従来#includeの s を C ソースで使用したり#import、objc ソース (#importはコンパイラの拡張機能であり、従来の C ではありません) に使用したりすることは、依然として慣用的です。

これは、「重複シンボル」リンカー エラーを排除するための推奨されるアプローチですか?

いいえ、リンカー エラーは防止されません。コンパイル フェーズ中に重複宣言エラーが発生する可能性があります。

重複するシンボル リンカ エラーが発生する場合、問題は定義の可視性など、別の何かです。そのために、問題のあるプログラムの例を提供する必要があります。

于 2012-09-05T09:17:42.747 に答える