【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.