2017-09-20 30 views
2

名前空間の検索順序は、タグの名前空間の通常名前空間ですか?次のコードを考えてみましょう:変数は、最初のタグの名前空間で印刷するために、コンパイラが見えCのネームスペース検索順序

7

7

#include <stdio.h> 

int main (void){ 

    typedef struct{ //This belongs to ordinary name space 
    int min; 
    } st; 
    st myst; 
    myst.min=6; 
    struct myst{ // This belongs to tag name space 
    int min; 
    }; 
    myst.min=7; 
    printf("%d\n%d\n",myst.min,myst.min); 
    return 0; 
} 

出力、私は推測します。通常の名前空間で同じ識別子に対してルックアップが実行されるかどうかはわかりませんが、それが行われた場合、なぜそれが印刷されないのかはわかりません。

+0

* "コンパイラは、最初にタグ名前空間に出力する変数を探します。" - いいえ。あなたはタグキーワードを指定していません。 – StoryTeller

+0

明確ではありません。名前は指定した名前空間内でのみ検索されます。 Btw:「タグ名空間」はありません。 – Olaf

+0

@StoryTellerタグのキーワード?あなたを得られなかった。 'struct'はタグ名です。 – 0decimal0

答えて

7

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; 
} 

が、これはハードエラーを生成しますコンパイルしようとすると:あなたはmainmyst.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)

+0

実際に同じ名前を定義すると、競合が発生します。ルックアップの順序についてはまだ混乱しています。 – 0decimal0

+2

@ 0decimal0、検索順序はありません。特定の識別子については、1つの名前空間しか考慮されません。どの種類の識別子が参照されているかによって決定されます。構造タグは独自の名前空間を持つ1つの種類です。変数名は、より広いカテゴリーの「普通の識別子」にあり、別々の名前空間を持ちます。他にも名前空間もありますが、コンパイラはコンテキストから、指定された識別子に関連するものを常に知ることができます。 –

+0

ありがとう@ジョンボールリンガー、私は今それを得る。 – 0decimal0

3

Cの名前空間は、完全に互いに素です。各識別子は、1つの名前空間内で検索されます。たとえば:structunionキーワードをたどる

  • 識別子は、タグの名前空間で検索されgotoキーワードをたどる
  • 識別子は.または->記号をたどる
  • 識別子がで検索されたラベルの名前空間で検索されそれらの構造体または共用体メンバの名前空間(各構造体および共用体には独自のメンバ名前空間があり、前の式の型によって検索する対象が決まります)
  • 他の識別子は通常の名前で検索されますペース。

検索の順序はありません。検索する(一意の)名前空間は、コンテキストによって完全に決定されます。

+0

あなたは答えは簡潔で簡潔です、ありがとうございます。 upvoted :) – 0decimal0

関連する問題