2017-03-19 4 views
1

私のコードはC11標準6.7.2.3は、特定のタイプは、その含有量は最大で1回

1 #include <stdio.h>               
2 int main(void) 
3 { 
4   union test1 { 
5     int a; 
6   }; 
7 
8   union test1 { 
9     int a; 
10   }; 
11 
12   return 0; 
13 } 

コンパイルエラーの下にある定義されなければならないタグ​​:
エラーメッセージ再定義、
私の考えでは、以下のコードを宣言する必要があります。
なぜ再定義とは?
なぜ再宣言しませんか?

4   union test1 { 
5     int a; 
6   }; 

Q2:
で最も一度C11標準

6.7.2.3 Tags A specific type shall have its content defined at most once.

に従って=== >>>私のコードは、2回を持っているので、エラーが起こります。 "特定のタイプ" 以下のコードのクレートタイプ?

union test1 { 
      int a; 
}; 

答えて

0

あなたは定義と宣言を間違って理解しています。質問What is the difference between a definition and a declaration?の回答を参照してください。 union test1;は宣言ですが、union test1 {int a;};は定義であることがわかります。

また、関数内で共用体を定義しています。これは良い考えではありません。だから、あなたが最も可能性が高い、これを行うことになるでしょう:

#include <stdio.h>               

union test1 { 
     int a; 
}; 

int main(void) 
{ 
     return 0; 
} 
...か、これは:

#include <stdio.h>               

int main(void) 
{ 
     union { 
      int a; 
     } test1; 

     union { 
      int a; 
     } test2; 

     return 0; 
} 

あなたが本当に2つの宣言(および一つの定義を)したい場合は、あなたがこれを行うことができます:

#include <stdio.h>               

union test1; 

union test1; 

union test1 { 
     int a; 
}; 

int main(void) 
{ 
     return 0; 
} 
+0

こんにちは、私はエラーをコンパイラは言うエラー: '組合test1'の再定義、それは組合test1を再定義することを意味します。変数ではなく、私は組合と変数の定義を混乱させました。 – youchihwang

関連する問題