私は、以下のようにvextern使用するいくつかのCコードを持っており、この目的が何であるかを知っていただきたいと思います:このコードでvexternは何を使用していますか?
FILE1.C:
#define FILE1_G_
file1.h:
#ifdef FILE1_G_
# define vextern
#else
# define vextern extern
#endif
私は、以下のようにvextern使用するいくつかのCコードを持っており、この目的が何であるかを知っていただきたいと思います:このコードでvexternは何を使用していますか?
FILE1.C:
#define FILE1_G_
file1.h:
#ifdef FILE1_G_
# define vextern
#else
# define vextern extern
#endif
define
は1つのファイルでのみ変数を定義するのに使用されていますが、このヘッダーを含むすべてのファイルで宣言していると思います。
file1.h
に、あなたはvextern int a;
を持っている、あなたは、いくつかの.cファイルで、このファイルを含める場合は、変数a
はライン#define FILE1_G_
を持つファイルで定義されます。 (あなたの例では、file1.c
)
これはpreprocessor macroです。
FILE1_G_
が定義されている場合、vextern
のすべての出現がextern
に置き換えられます。ない場合は、それらを削除している
編集(何に置き換え)は、以下のコメントに基づいて明確にする:それはそれはextern
かないと宣言していますいずれかを意味
。単語vextern
のみが影響を受けます。
ユースケースでは、.c
ファイルでは、を定義することによって、そのヘッダを含める前にvextern
によって「タグ付け」されたものを定義できます。
デフォルトでは(FILE1_G_
が定義されていなかった)現在file1.h
含めている.c
ファイルがFILE1_G_
を定義していないとvextern
でタグ付けされたものを定義するのではなく、彼らが宣言されてきたので、それらを使用できることを意味しますそのヘッダと他のどこかで定義されています。
.hファイルがある場合、vextern void funcバツ);これは、基本的にextern void func(int x)として定義されます。またはvoid func(int x)を返します。いずれの方法でも、デフォルトはexternなので、この状況では不要と思われるでしょうか?それとも、ライン全体が何に置き換えられているのでしょうか? – SSS
私の返信のコメントを整理し、私の答えの編集として投稿しました。 –
どちらが正しいかわかりません。もう一つの答えは、単語vexternだけが影響を受けることを示唆しています。つまり、intは常に定義されますか? – SSS
定義されません。それは宣言されるでしょう。 (いくつかのファイルを含むプログラムを書くときには、一度だけ変数を定義する必要がありますが、それを使用するすべてのファイルで宣言する必要があります。) – asaelr