다음 조합이 있으며 올바르게 작동합니다.
#pragma pack(1)
...
union
{
uint8_t opcode;
struct
{
uint8_t z : 3;
uint8_t y : 3;
uint8_t x : 2;
};
}opcode;
유니온의 크기는 정확히 1 바이트입니다.
printf ("%zu\n", sizeof opcode);
문제는 비트 필드에서 유니온을 만들려고 할 때 발생합니다.
union
{
uint8_t opcode;
struct
{
uint8_t z : 3;
union
{
uint8_t y : 3;
struct
{
uint8_t p : 2;
uint8_t q : 1;
};
}y;
uint8_t x : 2;
};
}opcode;
결과
printf ("%zu\n", sizeof opcode);
3 바이트입니다. 물론 매크로를 사용하여이 문제를 해결할 수 있지만 가능합니까?
아니요, 바이트의 일부인 구조체를 가질 수 없습니다.
이론적 해석:
구조체에 대한 포인터를 만들 수 있어야하며 주소 지정 가능한 최소 단위는 1 바이트입니다.
참고 :이 제한은 내가 아는 모든 컴파일러에 존재합니다. 실제로 C 표준에 의해 의무화되었는지 여부는 모르겠습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다