유니온에서 현재 어떤 유형이 사용되고 있는지 어떻게 확인합니까?
우리에게 노조가 있다고 가정해 보겠습니다.
typedef union someunion {
int a;
double b;
} myunion;
a=123과 같이 설정한 후 union에 어떤 유형이 있는지 확인할 수 있습니까?제 접근 방식은 이 유니언을 어떤 구조에 추가하고 유니언 유형을 int일 때는 1로, 더블일 때는 2로 설정하는 것입니다.
typedef struct somestruct {
int uniontype
myunion numbers;
} mystruct;
더 좋은 해결책이 없을까요?
더 좋은 해결책이 없을까요?
아니요, 당신이 보여준 솔루션이 가장 좋은 솔루션입니다. union
는 매우 단순합니다. 사용자가 무엇에 할당했는지 "추적"하지 않습니다.모든 구성원에 대해 동일한 메모리 범위를 재사용할 수 있습니다.그들은 그 이상의 다른 것을 제공하지 않으므로, 그들을 하나로 묶습니다.struct
추적을 위해 "유형" 필드를 사용하는 것이 정확하게 옳은 일입니다.
C는 유니언에서 현재 사용 중인 필드를 자동으로 추적하지 않습니다. (사실 "잘못된" 필드에서 읽은 결과 구현 정의 동작이 발생한다고 생각합니다.)따라서 현재 어떤 코드가 사용/작성되었는지 추적하는 것은 코드에 달려 있습니다.
별도의 '조합 유형' 변수를 유지하는 방법은 이에 대한 매우 일반적인 접근 방식이므로 잘 작동해야 합니다.
현재 저장된 형식을 직접 쿼리할 수 있는 방법은 없습니다.union
.
저장된 유형을 알 수 있는 유일한 방법은union
명시적인 플래그가 있어야 합니다(예: 당신의mystruct
예) 또는 유니언에 알려진 활성 요소가 있을 때 코드의 특정 부분에만 제어가 흐르도록 합니다.
응용 프로그램에 따라 수명이 짧은 개체인 경우 컨트롤 흐름에서 유형을 인코딩할 수 있습니다. 즉, 두 경우 모두에 대해 별도의 블록/함수가 있습니다.
struct value {
const char *name;
myunion u;
};
void throwBall(Ball* ball)
{
...
struct value v;
v.name = "Ball"; v.u.b = 1.2;
process_value_double(&v); //double
struct value v2;
v2.name = "Age";
v2.u.a = 19;
check_if_can_drive(&v2); //int
...
}
void countOranges()
{
struct value v;
v.name = "counter";
v.u.a = ORANGE;
count_objects(&v); //int
}
경고: 다음은 학습 목적으로만 사용됩니다.
이를 위해 몇 가지 추악한 속임수를 사용할 수 있습니다(연합에 있는 데이터 유형의 크기가 서로 다른 경우가 현재의 경우).
#include <stdio.h>
typedef union someunion {
int a;
double b;
} myunion;
typedef struct somestruct {
int uniontype;
myunion numbers;
} mystruct;
#define UPDATE_CONTENT(container, value) if ( \
((sizeof(value) == sizeof(double)) \
? (container.uniontype = ((container.numbers.b = value), 2)) \
: (container.uniontype = ((container.numbers.a = value), 1))))
int main()
{
mystruct my_container;
UPDATE_CONTENT(my_container, 42);
printf("%d\n", my_container.uniontype);
UPDATE_CONTENT(my_container, 37.1);
printf("%d\n", my_container.uniontype);
return (0);
}
하지만 절대 그러지 말 것을 권합니다.
어쩌면 내 변종이 도움이 되고 있을지도 모릅니다.
struct Table
{
char mas[10];
int width;
int high;
union stat
{
int st;
char v;
} un;
};
Table tble[2];
strcpy(tble[0].mas, "box");
tble[0].high = 12;
tble[0].width = 14;
tble[0].un.v = 'S';
strcpy(tble[1].mas, "bag");
tble[1].high = 12;
tble[1].width = 14;
tble[1].un.st = 40;
//struct Table *ptbl = &tble[0];
//ptbl++;
for (int i = 0; i < 2; i++)
{
void *pt = &tble[i].un;
if(*((char*)pt) == 'S')
sort(put_on_bag_line);
else
sort(put_on_box_line);
}
언급URL : https://stackoverflow.com/questions/16623226/how-to-check-what-type-is-currently-used-in-union
'sourcecode' 카테고리의 다른 글
스토어 fake api 배열에서 새 항목 이동 해제 (0) | 2023.07.02 |
---|---|
행렬 또는 데이터 프레임의 모든 행에 함수 적용 (0) | 2023.07.02 |
SQL 스키마 비교 오류 "Target is unavailable" (0) | 2023.07.02 |
SQL 쿼리의 결과 집합에 행 번호 추가 (0) | 2023.07.02 |
SQL Developer는 스크립트 실행을 지원합니까? (0) | 2023.06.27 |