Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 编译时的偏移量_C_Struct_Macros_C Preprocessor_Offsetof - Fatal编程技术网

C 编译时的偏移量

C 编译时的偏移量,c,struct,macros,c-preprocessor,offsetof,C,Struct,Macros,C Preprocessor,Offsetof,有没有办法在编译时找到结构成员的偏移量?我希望创建一个包含结构构件偏移量的常量。在下面的代码中,offsetof()宏在第一条printf语句中工作。但是,在第10行中使用声明ofs会产生错误: “无法将'->'运算符解析为常量表达式” 还有别的办法吗 struct MyStruct { unsigned long lw; unsigned char c[5]; int i; int j; unsigned long last; }; const int ofs

有没有办法在编译时找到结构成员的偏移量?我希望创建一个包含结构构件偏移量的常量。在下面的代码中,
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;
}

在我添加适当的#includes之后,它在这里使用g++4编译而没有任何警告

包括STDEF.h在内吗?offsetof()是一个宏,而不是C中的内置关键字


如果这还不能解决问题,那么试着将常数设为静态,将其限制在模块内。这可能会让编译器感到高兴。

在我添加了适当的#includes之后,它在这里使用g++4编译而没有任何警告

包括STDEF.h在内吗?offsetof()是一个宏,而不是C中的内置关键字

如果这还不能解决问题,那么试着将常数设为静态,将其限制在模块内。这可能会让编译器感到高兴。

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

一个例子是:

#define offsetof( type, member ) ( (size_t) &( ( (type *) 0 )->member ) )
虽然从技术上讲不是编译时构造(请参见用户“litb”的注释),但每个编译器必须至少有一个能够在编译时解析的表达式,这正是中定义的
offsetof()

您的代码可能还有其他错误-缺少include或其他一些使编译器恼火的事情。

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

一个例子是:

#define offsetof( type, member ) ( (size_t) &( ( (type *) 0 )->member ) )
虽然从技术上讲不是编译时构造(请参见用户“litb”的注释),但每个编译器必须至少有一个能够在编译时解析的表达式,这正是中定义的
offsetof()


您的代码可能还有其他错误-缺少include,或者其他一些让编译器恼火的事情。

如果您有一个
#include
(您引用的错误消息没有意义),那么它就是编译器中的错误
offsetof
结果在C99和C90中都是一个整数常量表达式。

如果您有一个
#include
(您引用的错误消息没有意义),则它是编译器中的一个错误
offsetof
result在C99和C90中都是一个整数常量表达式。

当然,这不是他所说的“编译时”的意思。您展示了一个不使用库函数的构造,但这并不意味着它的计算结果是编译时值。当然,代码是否实际发出是无关紧要的——C草稿说“算术常量表达式应具有算术类型,并且只能具有整数常量、浮点常量、枚举常量、字符常量和表达式大小的操作数。”。混合中不允许使用指针。
offsetof
是编译时构造,计算结果为整数常量表达式,但您的示例实现不允许。语言中无法将offsetof()定义为计算结果为整数常量表达式的内容。如果不使用指针,就无法定义它。无论您做什么,您都将始终依赖编译器内置和/或编译器的功能来适当优化您的表达式。查看offsetof上的Wikipedia或任何开源C库。因此,虽然您在整数常量表达式的定义上在技术上是正确的(我修改了我的措辞),但您将矛头指向我的示例实现是错误的。值得一提的是,上述实现与(glibc)中的实现相同。/resolv/nss_dns/dns network.c.我不仅将矛头指向了您的示例实现,但是您的示例实现附带了“请参阅,所有编译时”。我知道该宏的实现可能有缺陷(提问者很可能只是碰到了这样一个缺陷的实现)。我不能对c-files宏发表评论,但如果它使用了这样一个东西,并声称是“offsetof”的便携式替代品(我怀疑——因为该文件看起来是“官方的”),那么它就错了——但它可能仍能达到其目的。例如,GCC的实现只是调用“builtin\u offsetof”。当然,这不是他所说的“编译时”的意思。您展示了一个不使用库函数的构造,但这并不意味着它的计算结果是编译时值。当然,代码是否实际发出是无关紧要的——C草稿说“算术常量表达式应具有算术类型,并且只能具有整数常量、浮点常量、枚举常量、字符常量和表达式大小的操作数。”。混合中不允许使用指针。
offsetof
是编译时构造,计算结果为整数常量表达式,但您的示例实现不允许。语言中无法将offsetof()定义为计算结果为整数常量表达式的内容。如果不使用指针,就无法定义它。无论您做什么,您都将始终依赖编译器内置和/或编译器的功能来适当优化您的表达式。查看offsetof上的Wikipedia或任何开源C库。因此,虽然您在整数常量表达式的定义上在技术上是正确的(我修改了我的措辞),但您将矛头指向我的示例实现是错误的。值得一提的是,上述实现与(glibc)中的实现相同。/resolv/nss_dns/dns network.c.我不仅将矛头指向了您的示例实现,但是您的示例实现使用了“see,all compile ti