gpt4 book ai didi

结构成员的偏移量用作数组长度时的编译错误

转载 作者:太空狗 更新时间:2023-10-29 16:11:47 33 4
gpt4 key购买 nike

当使用 GCC 4.8.3 编译以下代码时,我收到一条错误消息“arrTest.c:12:4: error: variable-sized object may not be initialized”。但同样的代码在使用 GCC 4.1 编译时编译得很好。谁能帮我解决这个问题?

#define OFFSET(structure, member)    /* byte offset of member in structure*/\
((const int) &(((structure *) 0) -> member))

typedef struct test{
int a;
char b;
int c;
}test;

void main()
{
int arr[OFFSET(test, b)] = {0};

printf("%d %d\n", arr[0], OFFSET(test, b));

return;
}

不过,删除数组初始化可以解决问题。但是,在我的代码中有很多这样的实例。所以我不想到处去修改。我想知道 GCC 4.8 中是否有任何方法可以通过一些编译标志或修改 MACRO 的定义来解决这个问题,因为相同的代码可以用 GCC 4.1 干净地编译。

最佳答案

您的 OFFSET 宏在现代 C 中是不正确的,因为取消引用空指针是未定义的行为;此外,在现代 C 语言中没有提供任意指针算法来生成编译时常量,这就是为什么 gcc 提示数组大小可变的原因。

幸运的是,现代 C 提供了一个 offsetof macro in stddef.h ,它具有完全定义的行为并产生编译时常量:

#include <stddef.h>
#define OFFSET(structure,member) offsetof(structure, member)

// rest of code

Live example .

我无法访问像 gcc 4.1 这样旧的编译器,但如果它碰巧不支持 offsetof,那么您可以通过预处理器条件版本检查返回到您的定义:

#ifdef __GNUC__ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC__MINOR__ >= 8))
# include <stddef.h>
# define OFFSET(structure,member) offsetof(structure, member)
#else
# define OFFSET(structure, member) /* byte offset of member in structure*/\
((const int) &(((structure *) 0) -> member))
#endif

关于结构成员的偏移量用作数组长度时的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30050609/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com