【发布时间】: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;这是一个错误,因为它会导致严格的别名冲突。你调用了未定义的行为。