2012-07-04 1 views
8

비트 필드를 공용체와 함께 사용하는 것이 유효합니까? 이것은 노동 조합과 함께 할 수 있으면 나는이 같은 구조 비트 필드를 사용했다

struct 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

지금 내가 그래서 내가 발견 코드와 같은,

union 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

수정보고 궁금 비트 필드가 유니온과 작동하지만 유니온의 모든 필드는 출력에서 ​​이해할 때 단일 비트로 제공됩니다. 이제는 비트 필드를 조합으로 사용하는 것이 잘못되지 않았 음을 알게되었지만, 이와 같이 사용하는 것은 작동 상 올바르지 않습니다. 그래서 대답은 무엇입니까 - 노조와 비트 필드를 사용하는 것이 유효합니까?

+0

, 정확히 무엇을 작동하지 않습니다하세요? – alk

답변

12

총과 총알이 있습니다. 그것으로 발에 자아를 발라도 괜찮습니까? 당연히 아니지만, 원한다면 아무도이 일을하지 못하게 할 수 있습니다.

요점은 총과 총알처럼 도구와 도구이며 목적, 용도 및 "남용"이 있다는 점입니다. 위에서 작성한 것처럼 유니온에서 비트 필드를 사용하면 코드는 완벽하게 유효하지만 코드는 쓸모 없게됩니다. 노조 내부의 모든 필드는 동일한 메모리를 공유하므로 언급 한 모든 비트 필드는 기본적으로 동일한 메모리를 공유하므로 플래그가 동일합니다.

12

유용하지만 발견 한대로 유용하지 않은 방식으로 사용했습니다.

이렇게하면 플래그를 사용하여 동시에 모든 비트를 재설정 할 수 있습니다.

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    unsigned int flags; 
}; 

또는 당신은 같은 것을 할 수 있습니다

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    struct { 
     unsigned int is_ready: 1; 
     unsigned int is_done: 1; 
     unsigned int is_waiting: 1; 
    }; 
}; 
+1

익명 구조를 원한다고 가정하고 세미콜론을 추가했습니다. 또한 표준 C가 아니라는 점에주의하십시오. gcc에서는 이들을 작동시키기 위해'-fms-extensions'을 사용해야합니다. – unkulunkulu

관련 문제