【C】Pointer (12) Incomplete Type: Union with Uncertain Enumerator List
※ 日本語ページはこちら
A type specifier of the form enum identifier without an enumerator list shall only appear after the type it specifies is complete.
Programs which includes union without an enumerator list, incomplete-union.c
#include <stdio.h>
int main (void)
{
        union union1 u_test1;
        union union2 u_test2;
        printf ("size of union1 is %d\n", sizeof(u_test1));
        union union3 {
                char c ;
                int i ;
        } u_test3 ;
        union union2  { char c; int i;} u_test2;
        printf ("size of union2 is %ld\n", sizeof(u_test2));
        printf ("size of union3 is %ld\n", sizeof(u_test3));
        printf ("u_test3.c is %d\n", u_test3.c);
        printf ("u_test3.i is %d\n", u_test3.i);
        u_test3.c = 10;
        printf ("size of union3 is %ld\n", sizeof(u_test3));
        printf ("u_test3.c is %d\n", u_test3.c);
        printf ("u_test3.i is %d\n", u_test3.i);
        u_test3.i = 260;
        printf ("size of union3 is %ld\n", sizeof(u_test3));
        printf ("u_test3.c is %d\n", u_test3.c);
        printf ("u_test3.i is %d\n", u_test3.i);
        return 0;
}Compile result of incomplete-union.c
$ gcc incomplete-union.c 
incomplete-union.c: In function ‘main’:
incomplete-union.c:5:15: error: storage size of ‘u_test1’ isn’t known
  union union1 u_test1;
               ^
incomplete-union.c:6:15: error: storage size of ‘u_test2’ isn’t known
  union union2 u_test2;
               ^Programs which does not include error generating parts, incomplete-union2.c
#include <stdio.h>
int main (void)
{
/*
	union union1 u_test1;
	union union2 u_test2;
	printf ("size of union1 is %d\n", sizeof(u_test1)); 
*/
	union union3 {
		char c ;
		int i ;
	} u_test3 ;
	union union2  { char c; int i;} u_test2;
	printf ("size of union2 is %ld\n", sizeof(u_test2)); 
	printf ("size of union3 is %ld\n", sizeof(u_test3)); 
	printf ("u_test3.c is %d\n", u_test3.c); 
	printf ("u_test3.i is %d\n", u_test3.i); 
	u_test3.c = 10;
	printf ("size of union3 is %ld\n", sizeof(u_test3)); 
	printf ("u_test3.c is %d\n", u_test3.c); 
	printf ("u_test3.i is %d\n", u_test3.i); 
	u_test3.i = 260;
	printf ("size of union3 is %ld\n", sizeof(u_test3)); 
	printf ("u_test3.c is %d\n", u_test3.c); 
	printf ("u_test3.i is %d\n", u_test3.i); 
	return 0;	
}Compile result and execution result incomplete-union2.c
$ gcc incomplete-union2.c 
demo@ubuntu:~/SelfStudy/c/pointers/ImcompleteType/enumarator$ ./a.out 
size of union2 is 4
size of union3 is 4
u_test3.c is -64
u_test3.i is -396685376
size of union3 is 4
u_test3.c is 10
u_test3.i is -396685558
size of union3 is 4
u_test3.c is 4
u_test3.i is 260You can see when the type is defined in using union.
That’s all for this time.
