다음을 통해 공유


union 선언

"공용 구조체 선언"은 변수 값의 집합을 지정하고 공용 구조체 이름을 지정하는 태그를 선택적으로 지정합니다. 변수 값을 공용 구조체의 "멤버"라고 하며 변수 값은 다른 형식이 될 수 있습니다. 공용 구조체는 다른 언어의 "가변 레코드"와 비슷합니다.

구문

struct-or-union-specifier:
struct-or-union identifier opt{ struct-declaration-list }
struct-or-union identifier

struct-or-union:
struct
union

struct-declaration-list:
struct-declaration
struct-declaration-list struct-declaration

공용 구조체 내용은 다음과 같이 정의됩니다.

struct-declaration:
specifier-qualifier-list struct-declarator-list ;

specifier-qualifier-list:
type-specifier specifier-qualifier-listopt
type-qualifier specifier-qualifier-listopt

struct-declarator-list:
struct-declarator
struct-declarator-list , struct-declarator

union 형식의 변수는 해당 형식으로 정의된 값 중 하나를 저장합니다. 구조체 및 공용 구조체 선언에 같은 규칙이 적용됩니다. 공용 구조체에 비트 필드를 포함할 수도 있습니다.

공용 구조체 멤버는 불완전한 형식, void 형식 또는 함수 형식을 가질 수 없습니다. 따라서 멤버는 공용 구조체의 인스턴스가 될 수 없지만 선언할 공용 구조체 형식의 포인터가 될 수는 있습니다.

공용 구조체 형식 선언은 템플릿만 가능합니다. 변수를 선언할 때까지는 메모리가 예약되지 않습니다.

참고

두 형식의 공용 구조체가 선언되고 값이 한 개 저장되지만 다른 형식으로 공용 구조체에 액세스하는 경우 결과를 신뢰할 수 없습니다. 예를 들어, floatint 의 공용 구조체가 선언됩니다. float 값이 저장되지만 나중에 int 로 값에 액세스합니다. 그러면 float 값의 내부 스토리지에 따라 값이 결정됩니다. 정수 값은 신뢰할 수 없습니다.

다음은 공용 구조체의 예제입니다.

union sign   /* A definition and a declaration */
{
    int svar;
    unsigned uvar;
} number;

이 예제에서는 sign 형식으로 공용 구조체 변수를 정의하며 멤버가 2개 있고 이름이 number인 변수를 선언합니다. svar 멤버는 부호 있는 정수이고 uvar 멤버는 부호 없는 정수입니다. 이 선언을 사용하면 number의 현재 값을 부호 있는 값이나 부호 없는 값으로 저장할 수 있습니다. 이 공용 구조체 형식과 연결된 태그는 sign입니다.

union               /* Defines a two-dimensional */
{                   /*  array named screen */
    struct
    {
      unsigned int icon : 8;
      unsigned color : 4;
    } window1;
    int screenval;
} screen[25][80];

screen 배열에 2,000개의 요소가 있습니다. 배열의 각 요소는 멤버 2개(window1screenval)가 있는 개별 공용 구조체입니다. window1 멤버는 비트 필드 멤버 2개(iconcolor)가 있는 구조체입니다. screenval 멤버는 int입니다. 지정된 시간에 각 공용 구조체 요소는 int로 표현되는 screenvalwindow1로 표현되는 구조체를 포함합니다.

Microsoft 전용

중첩된 공용 구조체가 다른 구조체나 공용 구조체의 멤버일 경우 익명으로 선언할 수 있습니다. 다음은 이름 없는 공용 구조체의 예제입니다.

struct str
{
    int a, b;
    union            /* Unnamed union */
    {
      char c[4];
      long l;
      float f;
   };
   char c_array[10];
} my_str;
.
.
.
my_str.l == 0L;  /* A reference to a field in the my_str union */

특정 시간에 공용 구조체에 포함된 데이터의 형식을 제공하는 필드가 포함된 구조체 안에 공용 구조체가 종종 중첩됩니다. 다음은 이런 공용 구조체 선언의 예제입니다.

struct x
{
    int type_tag;
    union
    {
      int x;
      float y;
    }
}

공용 구조체 참조에 대한 자세한 내용은 구조체 및 공용 구조체 멤버를 참조하세요.

Microsoft 전용 종료

참조

선언자 및 변수 선언