【问题标题】:compilation error: cast from pointer to integer of different size [duplicate]编译错误:从指针转换为不同大小的整数[重复]
【发布时间】:2019-05-11 18:15:17
【问题描述】:

我正在使用以下代码:

#define OFFSETOF(_s, _m) ((uint32_t)(uint32_t *)(&(((_s *)0)->_m)))

typedef struct test
{
    uint16_t param0;
    uint8_t param1;
} test;

uint32_t uStartAddr = OFFSETOF(test, param1);

但我得到了那个错误:

error: cast from pointer to integer of different size

【问题讨论】:

  • 你为什么要编造你自己的OFFSETOFstddef.h 已经有一个没有错误的。
  • 您应该使用muintptr_t 而不是uint32_t,因为您的系统中的指针是 64 位,而不是您假设的 32 位。这就是为什么您也应该使用标准宏,而不是尝试设计自己的宏——至少在应该是“生产质量”而不是练习的代码中。 offsetof() 宏很奇特;它不能是一个函数。但是从地址 0 获取偏移量的地址是不确定的——它通常会起作用,但标准肯定不能保证。这就是实现定义offsetof的原因;它知道可以做什么。
  • 我不能打字——我的意思是uintptr_t,不是muintptr_t。对不起!

标签: c


【解决方案1】:

您的平台具有大于 32 位的指针。此外,offsetof() 表达式的类型应该是size_t。您应该:

  • 使用来自<stddef.h>的标准offsetof

  • 如果您的编译器不提供上述定义,请使用以下替代方法:

    #define OFFSETOF(_s, _m) ((size_t)(&((_s *)0)->_m))
    
  • 如果你还有问题,试试这个:

    #define OFFSETOF(_s, _m) ((size_t)((char*)&((_s *)0)->_m - (char*)0))
    

【讨论】:

  • 只是 offsetof 完全错误,将指针投射到错误的对齐方式等等......
  • @AnttiHaapala:当然,便携式答案是使用<stddef.h>,但两种发布的替代方案都可能有效。
  • 如果您的实现在<stddef.h> 中没有提供offsetof,则它不符合要求并且可能还有其他问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多