2012-02-15 16 views
0

私は、以下のようにvextern使用するいくつかのCコードを持っており、この目的が何であるかを知っていただきたいと思います:このコードでvexternは何を使用していますか?

FILE1.C:

#define FILE1_G_ 

file1.h:

#ifdef FILE1_G_ 
# define vextern 
#else 
# define vextern extern 
#endif 

答えて

5

defineは1つのファイルでのみ変数を定義するのに使用されていますが、このヘッダーを含むすべてのファイルで宣言していると思います。

file1.hに、あなたはvextern int a;を持っている、あなたは、いくつかの.cファイルで、このファイルを含める場合は、変数aはライン#define FILE1_G_を持つファイルで定義されます。 (あなたの例では、file1.c

+0

どちらが正しいかわかりません。もう一つの答えは、単語vexternだけが影響を受けることを示唆しています。つまり、intは常に定義されますか? – SSS

+0

定義されません。それは宣言されるでしょう。 (いくつかのファイルを含むプログラムを書くときには、一度だけ変数を定義する必要がありますが、それを使用するすべてのファイルで宣言する必要があります。) – asaelr

2

これはpreprocessor macroです。

FILE1_G_が定義されている場合、vexternのすべての出現がexternに置き換えられます。ない場合は、それらを削除している

編集(何に置き換え)は、以下のコメントに基づいて明確にする:それはそれはexternかないと宣言していますいずれかを意味

。単語vexternのみが影響を受けます。

ユースケースでは、.cファイルでは、を定義することによって、そのヘッダを含める前にvexternによって「タグ付け」されたものを定義できます。

デフォルトでは(FILE1_G_が定義されていなかった)現在file1.h含めている.cファイルがFILE1_G_を定義していないとvexternでタグ付けされたものを定義するのではなく、彼らが宣言されてきたので、それらを使用できることを意味しますそのヘッダと他のどこかで定義されています。

+0

.hファイルがある場合、vextern void funcバツ);これは、基本的にextern void func(int x)として定義されます。またはvoid func(int x)を返します。いずれの方法でも、デフォルトはexternなので、この状況では不要と思われるでしょうか?それとも、ライン全体が何に置き換えられているのでしょうか? – SSS

+0

私の返信のコメントを整理し、私の答えの編集として投稿しました。 –