Objective-C の #import と #include の違いは何ですか? 質問する

Objective-C の #import と #include の違いは何ですか? 質問する

Objective-C の #import と #include の違いは何ですか? また、どちらか一方を使用したほうがよい場合はありますか? どちらかが非推奨ですか?

私は次のチュートリアルを読んでいました:http://www.otierney.net/objective-c.html#preambleそして、#import と #include に関する段落は矛盾しているように思われるか、少なくとも不明瞭です。

ベストアンサー1

プリプロセッサに関しては多くの混乱があるようです。

コンパイラが を見つけたときに行うことは#include、質問なしでその行をインクルードされたファイルの内容に置き換えることです。

a.hしたがって、次の内容のファイルがある場合:

typedef int my_number;

次の内容のファイルb.c:

#include "a.h"
#include "a.h"

ファイルはb.cコンパイル前にプリプロセッサによって変換されます

typedef int my_number;
typedef int my_number;

型が 2 回定義されているため、コンパイラ エラーが発生しますmy_number。定義は同じですが、C 言語ではこれは許可されていません。

ヘッダーは複数の場所で使用されることが多いため、 C では通常、インクルード ガードが使用されます。これは次のようになります。

 #ifndef _a_h_included_
 #define _a_h_included_

 typedef int my_number;

 #endif

前処理された後でも、ファイルにはヘッダーの内容全体が 2 回含まれます。ただし、マクロはすでに定義されているb.cため、2 番目のインスタンスは無視されます。_a_h_included_

これは非常にうまく機能しますが、2 つの欠点があります。まず、インクルード ガードを記述する必要があり、マクロ名は各ヘッダーで異なる必要があります。次に、コンパイラーは、インクルードされるたびにヘッダー ファイルを探して読み取る必要があります。

Objective-C には#importプリプロセッサ命令があります (一部のコンパイラとオプションを使用すると、C および C++ コードにも使用できます)。これは とほぼ同じです#includeが、どのファイルがすでにインクルードされているかを内部的に記録します。#import行は、最初に遭遇したときにのみ、指定されたファイルの内容に置き換えられます。その後は、単に無視されます。

おすすめ記事