【问题标题】:Get offset to struct member without using offsetof在不使用 offsetof 的情况下获取结构成员的偏移量
【发布时间】:2017-02-06 21:17:17
【问题描述】:

我必须在已经存在的大代码中添加一段代码。 我的代码中有一个指针,*Ptr。该指针的类型为无符号字符。

无符号字符 *Ptr;

我有以下结构。

struct
{
   uint8_t tag;
   uint16_t data[size];
   bool status;
}Test;

Test *TagData;

指针的类型转换如下,现在结构指针指向指针 Ptr 指向的位置;

TagData = (Test *)Ptr;

在我的代码中,我会将一些输出值复制到此结构中,以便将这些值复制到 *Ptr 指向的内存位置。

为了将一些值复制到结构中的数据数组中,我需要找到该结构成员的偏移量。我想在不使用 offsetof 函数的情况下做到这一点。我尝试执行以下操作,但出现编译器错误。

TagData->data  = (uint16_t *) (Ptr + sizeof(TagData->tag));

谁能告诉我该怎么做?而且我不想使用 offsetof 函数。有没有更简单的方法来做到这一点?

【问题讨论】:

  • 真正的问题是:你为什么不想使用offsetof?您可以通过重用典型的 offsetof 定义 ((int)(&((type *)0)->member)) 轻松做到这一点。但这可能不会解决您的问题,因为它实际上是同一件事。现在,如果是因为您需要非 POD 类的偏移量并且编译器抱怨,那么编译器通常会提供一些内在函数:例如__builtin_offsetof 用于 gcc。
  • C 只提供最少的功能集。因此,如果有标准方式,offsetof 就不会被添加到标准中。
  • 比使用offsetof 宏更简单的方法是直接使用相关成员并使用指向此类成员的指针。在 99% 的情况下,根本没有理由在整数类型和指针之间来回计算偏移量。不要这样做。你只会弄错,它不会让你的代码更快。指针强制转换是邪恶的。
  • 你为什么不用&ptr->data ??!
  • (Test *)Ptr; 这是一个错误,因为它会导致严格的别名冲突。你调用了未定义的行为。

标签: c pointers


【解决方案1】:

不,没有比使用offsetof 更简单的方法了,它旨在满足您的需求。

另外,offsetof 不是一个函数,而是一个宏,隐藏了不使用 offsetof 时会执行的指针运算。

所以,明确的答案:因为你甚至没有给出一个理由,所以它不能成为一个过分充分的理由。克服它并使用offsetof。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2022-01-03
    • 2014-07-22
    • 1970-01-01
    • 2011-01-03
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多