크로스 플랫폼 환경에서 Qt로 작업하고 있습니다. 그리고 우리는 다음과 같은 문제를 겪고 있습니다. Windows에서 int
과 long int
은 모두 32 비트 정수입니다. 64 비트 MacOS 및 Linux의 경우 int
은 32 비트이고 long int
은 64 비트입니다 (https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models 참조).둘 다 32 비트 (Windows LLP64)인데 왜`long &`에서`int &`로 reinterpret_cast가 필요합니까?
따라서 플랫폼 간 라이브러리는 자체 고정 비트 typedef를 제공하는 경향이 있습니다. Windows에서 Qt는 quint32
을 unsigned int
으로 정의하고 unsigned long
개의 정수를 사용하지 않습니다. 또 다른 라이브러리는 Uint32
을 unsigned long
으로 정의합니다. 따라서 두 가지 모두 실제로 32 비트 부호없는 정수이지만 다른 원시 데이터 유형을 갖습니다.
지금, 우리가 사실 인하지 unsigned long
에 대해 정의되는 QDataStream
사업자에 대해 불평 ++ QDataStream
Uint32
데이터 및 놀랍게도 (여부) quint32
에 대해 정의 직렬화, 비주얼 C를 사용하려고하는 것이, 어떻게 Qt는 때문에 거의 동일한 unsigned int
을 대신 사용합니다. 내가 reinterpret_cast
해야합니까 이유 :
확인, 해결 방법은
#ifdef Q_OS_WIN
inline QDataStream & operator >> (QDataStream & stream, Uint32 & value)
{ return stream >> reinterpret_cast<quint32 &>(value); }
inline QDataStream & operator << (QDataStream & stream, Uint32 value)
{ return stream << quint32(value); }
#endif // def Q_OS_WIN
내 질문을 제공하는 것입니까? 나는 데이터 타입이 실제로 동일하다는 것을 이해했기 때문에 static_cast
으로 더 편하게 느낄 것이다. 여기 용이 있을까요?
실제로 uint32_t가 등장하기 전에 이러한 문제를 다루기 시작한 프로젝트입니다. 실패했을 때 설정을 건너 뛰는 것에 관해서는 if (QDataStream :: Ok == stream.status())'로 표시됩니다. 답변 해주셔서 감사합니다! –
임시 및 과제를 피할 수있는 방법이 있습니까? 그냥 쓸모없는 것처럼 보입니다 ... 여기에 제안 된 것과 같은 조합을 사용하면 https://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule? –
표준 앨리어싱은 표준 C++에서 정의되지 않은 동작입니다. (C에서 허용됩니다.) 정의되지 않은 동작에 의존하고 싶은지 여부는 여러분에게 달려 있습니다. –