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
行は、最初に遭遇したときにのみ、指定されたファイルの内容に置き換えられます。その後は、単に無視されます。