【发布时间】:2020-06-27 08:19:24
【问题描述】:
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) ];
};
错误:无效的类型转换:行的“int8_t={signed char} *”到“uint16_t={unsigned short}”
OffsetT dataStartBlockOffset = reinterpret_cast( &dummy->data[0] );
//dummy->data[0] 是有符号的 char* 并且 dataStartBlockOffset 是无符号短
上面的代码在 Windows 上可以正常编译,但只有 GCC 会失败。
【问题讨论】:
-
请您减少代码问题!
-
this_t* dummy = reinterpret_cast<this_t*>(0); // offsets is a type of uint16_t OffsetT dataStartBlockOffset = reinterpret_cast<OffsetT>( &dummy->data[0] );- 这在几个方面看起来都是错误的。首先,您可以使用reinterpret_cast有效地做一些不同的事情,而且这些看起来都不像其中任何一个。其次,dummy取消引用正在取消引用nullptr,这绝对是 Undefined Behaviour。 -
代码的目的是从对象的开头获取对象成员数据[]的偏移量,偏移量将是常数值,但可能会根据不同的操作系统环境而改变。该代码正在处理 MMF 和偏移量指针。
-
编译器错误不是异常,它们被打印出来,而不是抛出。不要滥用标准术语。
-
请正确格式化您的问题stackoverflow.com/editing-help#code
标签: c++ type-conversion offset gcc-warning