2012-02-28 3 views
4

몇 가지 가능한 선택 사항이있는 경우 어떤 유형의 노동 조합이 포함되어 있는지 확인할 수 있습니까?노조에서 어떤 유형이 사용되는지 확인하는 방법은 무엇입니까?

typedef union 
{ 
    char  charArr[SIZE]; 
    int  intVal; 
    float floatVal; 
} VALUE_TYPE; 

VALUE_TYPE number; 
number.intVal = 8; 

값이 다른 곳에서 설정된 경우 여기에 노동 조합에 포함 된 것을 알 수있는 방법은 무엇입니까?

답변

5

상자에서 이런 종류의 것을 할 수 없다는 것이 맞습니다.

일반적인 해결 방법은 유니온과 함께 유형을 추가 할 수 있다는 것입니다. 예를 들어, 그것은 수 :

my_value number; 
number.val.intVal = 8; 
number.val.val_type = is_int 

당신이 일반적인 유형을해야 할 때 그것은 공통의 현대적인 패턴입니다 :

enum { charArr_type, float_type, int_type } VALUE_TYPE; 
typedef union 
{ 
    char  charArr[SIZE]; 
    int  intVal; 
    float floatVal; 
} VALUE; 
struct my_value { 
    VALUE val, 
    VALUE_TYPE val_type 
} 

을 한 후, 당신은 당신이 당신의 구조체를 할당 할 때 유형을 업데이트해야합니다 거의 모든 것을 저장할 수 있습니다.

예를 들어, PHP 소스 코드 어디에서나 찾을 수 있습니다. 이것은 같은 오브젝트에 다른 값 유형을 저장하는 방법입니다. 자세한 내용은 this page을 참조하십시오.

+0

그렇지만 메모리를 절약하려고한다면, 각 'VALUE'에 대해 추가로'enum' (정수?)를 저장해야합니다. 또한 사용자가 일관된 값을 저장하도록 강요 할 수 없습니다. 즉, 'my_value.val = 10; my_value.val_type = is_charArr; – vulkanino

+0

@vulkanino이 구조체를 올바르게 설정하고 가져올 수있는 래퍼를 만들 수 있습니다. PHP에서는 store-everything 구조체를 보호하기 위해 많은 매크로를 사용하고 유형을 uchar에 저장합니다. – Coren

1

아니요, 말할 수 없습니다. 언어에는 그 기능이 없습니다.

정보가 필요하면 스스로 추적해야합니다.

0

유니온을 사용하여 입력 한 모든 유형을 추적하고 적시에 올바른 유형을 검색해야합니다.

노동 조합을 사용하지 마십시오. 공간을 절약해야하는 그런 기억 문제가 정말로 있습니까?

관련 문제