它无法在 ISO C 中完成。但是...
GCC 有一个扩展,允许在结构中定义可变修改类型。所以你可以定义这样的东西:
#include <stddef.h>
#include <stdio.h>
int main() {
int n = 8, m = 20;
struct A {
int a;
char data1[n];
int b;
float data2[m];
int c;
} p;
printf("offset(a) = %zi\n", offsetof(struct A, a));
printf("offset(data1) = %zi\n", offsetof(struct A, data1));
printf("offset(b) = %zi\n", offsetof(struct A, b));
printf("offset(data2) = %zi\n", offsetof(struct A, data2));
printf("offset(c) = %zi\n", offsetof(struct A, c));
return 0;
}
除了一些关于使用非 ISO 功能的警告之外,它可以正常编译并产生预期的输出。
offset(a) = 0
offset(data1) = 4
offset(b) = 12
offset(data2) = 16
offset(c) = 96
问题是这种类型只能定义在block因此它不能用于将参数传递给其他函数。
但是,它可以传递给嵌套函数,这是另一个 GCC 扩展。例子:
int main() {
... same as above
// nested function
int fun(struct A *a) {
return a->c;
}
return fun(&p);
}