C++ 较新版本的GCC引发无效的转换错误
错误:无效的类型转换:行的int8_t={signed char}*到uint16_t={unsigned short} Offset dataStartBlockOffset=重新解释施法和模拟->数据[0] //dummy->data[0]为有符号字符*且dataStartBlockOffset为无符号短字符C++ 较新版本的GCC引发无效的转换错误,c++,type-conversion,offset,gcc-warning,C++,Type Conversion,Offset,Gcc Warning,错误:无效的类型转换:行的int8_t={signed char}*到uint16_t={unsigned short} Offset dataStartBlockOffset=重新解释施法和模拟->数据[0] //dummy->data[0]为有符号字符*且dataStartBlockOffset为无符号短字符 上面的代码在windows上编译很好,但只有在GCC上才失败。使用offsetof micro修复了编译错误。 OffsettDataStartBlockOffset=OffsetOf
上面的代码在windows上编译很好,但只有在GCC上才失败。使用offsetof micro修复了编译错误。
OffsettDataStartBlockOffset=OffsetOffsetOfficeOfffixedDataLock,数据 你能减少你的代码问题吗!此\u t*虚拟=重新解释\u cast0;//偏移量是uint16\u t OffsetT dataStartBlockOffset=reinterpret\u cast&dummy->data[0];-从几个方面看,这似乎是错误的。首先,你可以通过reinterpret_cast有效地做一些事情,这些事情看起来都不一样。第二,虚拟解引用是解引用一个nullptr,这是肯定的。代码的目的是从对象开始获取对象成员数据[]的偏移量,偏移量将是常量,但考虑到不同的操作系统环境,它可能会发生变化。代码正在处理MMF和偏移量指针。编译器错误不是异常,它们是打印的,而不是抛出的。不要滥用标准术语。请正确设置问题格式
class FixedDataBlock: public DataBlockHeaderCommon<BlockSize>
{
// Construction
public:
FixedDataBlock(void* pool, SizeT const entrySize, SizeT const alignment)
: base_t(eBlkFixData, pool)
{
this_t* dummy = reinterpret_cast<this_t*>(0);
// offsets is a type of uint16_t
OffsetT dataStartBlockOffset = reinterpret_cast<OffsetT>( &dummy->data[0] );
}
// Member variables
private:
int8_t data[ BlockSize-sizeof(header_t) ];
};