의 GCC 구현의 버그 :C11 다음 구조체의 작업 비트 필드
struct S {
unsigned a : 4;
_Bool b : 1;
};
는 _Bool
다음, 4 비트가 사용되는지의 unsigned
(4 바이트)로 GCC 의해 누워 얻는다 (4 바이트), 1 비트가 사용되며 총 크기는 8 바이트입니다.
C99 및 C11은 특별히 비트 필드 멤버로 _Bool
을 허용합니다. C11 표준 (그리고 아마도 C99도)도 §6.7.2.1 '구조와 노동 조합 지정자'¶11에서 상태가 :
구현은 비트 필드를 보관 유지하는데 충분한 크기가 어떤 주소 저장 장치를 할당 할 수 있습니다. 충분한 공간이 남아있는 경우, 구조 내의 다른 비트 필드 바로 뒤에 오는 비트 필드는 동일한 유닛의 인접한 비트로 패킹되어야합니다.
그래서 부재는 상기 b
총 4 바이트 크기의 구조체 초래 부재 a
에 할당 된 저장 부에 충전 된 것이 판단된다.
GCC가 제대로 작동하고 두 멤버에 대해 동일한 유형을 사용할 때 포장이 발생 않거나, 하나 unsigned
다른 signed
,하지만 유형 unsigned
및 _Bool
는이를 처리하기 위해 GCC으로도 별개의 것으로 간주 것 같다 때 바르게.
누군가 내 표준 해석을 확인할 수 있습니까? 그리고 이것이 실제로 GCC 버그입니까?
나는 또한 work-around (일부 컴파일러 스위치, pragma, __attribute__
...)에 관심이 있습니다.
내가 -std=c11
와 GCC 4.7.0를 사용하고 있습니다 (다른 설정이 동일한 동작을 보여줍니다 있지만.)
GCC 확장 '__attribute__ ((packed)'는 여기에있는 멤버들에게 적용될 수 있습니다. 이 문제와 직각을 이룹니다 (크기가 4 + 1 = 5 인 구조체, 즉 동일한 문제가 있음) – ndkrempel
관련 : http://stackoverflow.com/questions/308364/c-bitfield-packing-with -bools (그러나 C++은 비트 필드에 대한 표현이 정확하지 않습니다.) – ndkrempel
위의 질문에 대한 대답에 따르면이 동작은 gcc 4.2.4에서 발생하지 않았으므로 그 후 회귀. – ndkrempel