2013-09-05 4 views

답변

5

당신이 구현 정의 된 동작에 의존하는 경우, 다음 네,하지만 당신은 다르게 조금을 구성 할 수 있습니다

#ifdef UNNAMED_BITFIELDS_ARE_WELL_DEFINED 
#define ANON 
#else 
#define ANON3(X) anonymous__## X ##__ 
#define ANON2(X) ANON3(X) 
#define ANON ANON2(__LINE__) 
#endif 

struct union_struct { 
    char foo; 
    union { 
     struct { 
      char bar  : 2; 
      char ANON : 6; 
     }; 
     struct { 
      char ANON : 2; 
      char foobar1 : 6; 
     }; 
     struct { 
      char ANON : 2; 
      char foobar2 : 6; 
     }; 
    }; 
}; 

첫 번째 바이트는 foo이고 두 번째 바이트는 익명 공용체입니다. 그런 다음 익명 공용 구조체에는 3 개의 익명 구조체가 있습니다. 각 구조체는 (임의로) 이름이없는 비트 필드를 사용하여 foobar1foobar2bar 다음에 오는 동일한 6 비트를 나타낼 수 있도록합니다.

C.11 표준에 대한 나의 이해에서 UNNAMED_BITFIELDS_ARE_WELL_DEFINED을 정의하면 위의 코드가 정확합니다. 그러나 이름이없는 비트 필드가 잘 정의 된 의미를 가지는지 여부에 대한 논의가있는 것으로 보인다 (아래 주석 참조). 명명되지 않은 비트 필드에 잘 정의 된 의미가없는 경우 위의 코드는 각 ANON 매크로를 비트 필드의 이름으로 확장 할 수 있습니다. 비트 필드에 대해 임의의 다른 타입의 사용이 구현 정의하면서

그러나 C.11 표준 만 _Bool, intunsigned에 비트 필드를 정의 (C.11 § 6.7.2.1 ¶ 5) .

+0

'포장 된'no-ops는 둘 다 사용하지 않습니까? –

+0

@R .. : 음 ... 내 시스템에서 둘 다 제거 할 수 있으며 크기는 여전히 2입니다. 감사합니다. 대답이 업데이트되었습니다. – jxh

+0

팩 된 속성은 2 바이트로 내려 오기위한 시도의 일부일뿐입니다 – croyd

관련 문제