【C言語】ポインタ(11)タグを定義できるのは一回だけ

どうも。gochaです。

今回は、「2つの宣言が同一タグを使用する場合、それらは、同じ構造体、共用体、列挙体でなくてはいけない」について説明します。

自分の理解が間違っているかもしれませんが、自分がプログラムを書いて確認している限り、結局、同一のTag名は一回しか宣言できないんじゃないかなと考えてます。

コードを示します。

構造体と共用体で同じタグを使っているのでエラーになるプログラム。uniton-structure.c

#include <stdio.h>

int main (void ){
	union test {
		char c;
		int i;
	} test1;  	
	
	struct test {
		char c;
		int i;
	} test1;  	

	test1.c = "A";

	printf("test1.c = %c \n", test1.c);
	printf("test1.i = %i \n", test1.i);

	test1.i = 100 ;

	printf("test1.c = %c \n", test1.c);
	printf("test1.i = %i \n", test1.i);

	return 0;
}

union-structure.c のコンパイル結果

$ gcc union_structure.c 
union_structure.c: In function ‘main’:
union_structure.c:10:9: error: ‘test’ defined as wrong kind of tag
  struct test {
         ^
union_structure.c:13:4: error: conflicting types for ‘test1’
  } test1;   
    ^
union_structure.c:8:4: note: previous declaration of ‘test1’ was here
  } test1;   
    ^
union_structure.c:15:10: warning: assignment makes integer from pointer without a cast [enabled by default]
  test1.c = "A";
          ^

tag の名前を変更した場合 union_structure2.c

#include <stdio.h>

int main (void ){
        struct test2 {
                char c;
                int i;
        } st;

        union test1 {
                char c;
                int i;
        } uni;

        st.c = 'A';
        uni.c = 'A';
        st.i = 100 ;
        uni.i = 100 ;

        printf("st.c = %d \n", st.c);
        printf("st.i = %d \n", st.i);
        printf("uni.c = %d \n", uni.c);
        printf("uni.i = %d \n", uni.i);

        st.i = 260 ;
        uni.i = 260 ;
        printf("st.c = %d \n", st.c);
        printf("st.i = %d \n", st.i);
        printf("uni.c = %d \n", uni.c);
        printf("uni.i = %d \n", uni.i);

        return 0;
}

union_structure2.c コンパイル結果と実行結果

$ gcc union_structure2.c 
$ ./a.out 
st.c = 65 
st.i = 100 
uni.c = 100 
uni.i = 100 
st.c = 65 
st.i = 260 
uni.c = 4 
uni.i = 260 

今回はここまで。

!!! All copyrights belong to the writer of this contents.