2013-11-21 6 views
5

は、それは罰金コンパイルCの構造と機能の有効範囲の違いは何ですか?

int main(void) 
    { 
     typedef struct { 
      int i; 
     } s; 

     struct { 
      s s; 
     } t; 

     return 0; 
    } 

コードのこの部分を考えてみましょう。今、このコードはコンパイルされませんこの1

int main(void) 
    { 
     typedef struct { 
      int i; 
     } s; 

     s s; 
     return 0; 
    } 

を見てみましょう -

‘s’ redeclared as different kind of symbol. 

質問:それは正しいことですなぜ「S Sを;」構造体内の宣言として、関数内でこの定義を持つのは間違っていますか?

答えて

6

上の例のメンバーでは、sはstructのローカルです。 t.s構文を使用しないと使用できないため、構造タイプsと競合はありません。

下位構造体型sでは、変数sは同じスコープにあるため、どの参照先が不明です。

+0

+1その良い。このことはC標準で言及されると思いますか? –

+1

@ Mr.32はい、それは言及されています。 * "それぞれの構造体または共用体には、そのメンバーのために別の名前のスペースがあります(。または - >演算子を使用して メンバーにアクセスするために使用される式の型によって明確になります)。" * (n1547より) – user694733

3

structメンバーの場合、sという識別子は、常にsomestruct.sまたはsomeptr->sと表示されるため、曖昧ではありません。

関連する問題