【问题标题】:Newer version of GCC throws invalid conversion error较新版本的 GCC 引发无效转换错误
【发布时间】: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&lt;this_t*&gt;(0); // offsets is a type of uint16_t OffsetT dataStartBlockOffset = reinterpret_cast&lt;OffsetT&gt;( &amp;dummy-&gt;data[0] ); - 这在几个方面看起来都是错误的。首先,您可以使用reinterpret_cast 有效地做一些不同的事情,而且这些看起来都不像其中任何一个。其次,dummy 取消引用正在取消引用 nullptr,这绝对是 Undefined Behaviour
  • 代码的目的是从对象的开头获取对象成员数据[]的偏移量,偏移量将是常数值,但可能会根据不同的操作系统环境而改变。该代码正在处理 MMF 和偏移量指针。
  • 编译器错误不是异常,它们被打印出来,而不是抛出。不要滥用标准术语。
  • 请正确格式化您的问题stackoverflow.com/editing-help#code

标签: c++ type-conversion offset gcc-warning


【解决方案1】:

使用 offsetof micro 修复编译错误。 OffsetT dataStartBlockOffset = (OffsetT)offsetof(FixedDataBlock, data);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2012-05-07
    • 2021-07-23
    • 1970-01-01
    • 2018-02-26
    • 2018-06-16
    相关资源
    最近更新 更多