Cでは名前空間の参照順序はありません。特定の識別子に対して1つの名前空間しか考慮されません。どの種類の識別子が参照されているかによって決定されます。構造タグは独自の名前空間を持つ1つの種類です。変数名は、より広いカテゴリーの「普通の識別子」にあり、別々の名前空間を持ちます。他にも名前空間もありますが、コンパイラはコンテキストから、指定された識別子に関連するものを常に知ることができます。
したがって、myst.min
の両方の使用は、st myst;
と宣言された変数を参照しています。(あなたが思っていたように)「タグ」名前空間に第2の変数はありません。
test.c: In function ‘main’:
test.c:14:3: error: ‘myst’ undeclared (first use in this function)
は何struct myst
宣言がないことを宣言です:
#include <stdio.h>
int main (void){
#if 0
typedef struct{ //This belongs to ordinary name space
int min;
} st;
st myst;
myst.min=6;
#endif
struct myst{ // This belongs to tag name space
int min;
};
myst.min=7;
printf("%d\n%d\n",myst.min,myst.min);
return 0;
}
が、これはハードエラーを生成しますコンパイルしようとすると:あなたはmain
myst.min = 7
上内すべてをコメントアウトすることによって自分自身のためにこれを見ることができます
別のタイプを使用して、変数を宣言することができます。しかし、あなたが実際にそれをしない限り、何にも使われていません。例えば、
#include <stdio.h>
typedef struct { int min; } st;
struct myst { int min };
int main(void)
{
// uses the typedef name 'st', in the ordinary namespace,
// to declare the variable 'myst', also in the ordinary namespace
st myst = { 6 };
// uses the struct name 'myst', in the tag namespace,
// to declare the variable 'myst2', in the ordinary namespace
struct myst myst2 = { 7 };
printf("%d %d\n", myst.min, myst2.min);
return 0;
}
は、6 7
と表示されます。このプログラムはまた、myst
(変数)とmyst
(構造タグ)が実際には2つの異なる名前空間にあり、どのように独立して参照できるかを示しています。
(新しい最初の段落のジョン・ボリンジャーに感謝します。-ed)
* "コンパイラは、最初にタグ名前空間に出力する変数を探します。" - いいえ。あなたはタグキーワードを指定していません。 – StoryTeller
明確ではありません。名前は指定した名前空間内でのみ検索されます。 Btw:「タグ名空間」はありません。 – Olaf
@StoryTellerタグのキーワード?あなたを得られなかった。 'struct'はタグ名です。 – 0decimal0