8

有没有办法在编译时找到结构成员的偏移量?我希望创建一个包含结构成员偏移量的常量。在下面的代码中,offsetof()宏在第一printf条语句中起作用。但是,使用第 10 行声明会ofs产生错误:

“无法将 '->' 运算符解析为常量表达式”。

还有其他方法吗?

struct MyStruct
{
   unsigned long lw;
   unsigned char c[5];
   int i;
   int j;
   unsigned long last;
};

const int ofs = offsetof(struct MyStruct, i);  // This line in error

int main(void)
{
   printf("Offset of c = %d.\n", offsetof(struct MyStruct, c) );
   printf("Offset of i = %d.\n", ofs );
   return 0;
}
4

3 回答 3

10

offsetof() 宏一个编译时构造。没有标准兼容的方式来定义它,但是每个编译器都必须有某种方式来定义它。

一个例子是:

#define offsetof( type, member ) ( (size_t) &( ( (type *) 0 )->member ) )

虽然在技术上不是编译时构造(参见用户“litb”的评论),但每个编译器必须至少有一个这样的表达式,它能够在编译时解析,这正是offsetof()<stddef.h 中定义的内容>。

您的代码可能还有其他一些错误 - <stddef.h> 缺少包含,或者其他一些刺激编译器的事情。

于 2009-09-04T13:44:58.483 回答
4

在我添加正确的#includes 之后,它在此处使用 g++ 4 编译而不会发出警告。

你是#include stddef.h 吗?offsetof() 是一个宏,而不是 C 中的内置关键字。

如果这不能解决问题,请尝试将常量设为静态,以将其限制在模块中。这可能会让编译器高兴。

于 2009-09-04T13:38:05.153 回答
3

如果您有#include <stddef.h>我假设的错误消息(您引用的错误消息将毫无意义),那是您的编译器中的错误。offsetof结果是 C99 和 C90 中的整数常量表达式。

于 2009-09-04T16:55:29.443 回答