不,您不能对结构数据成员使用索引访问,除非您采取特定步骤来模拟它。
在 C++ 中,可以使用称为“指向数据成员的指针”的特定于 C++ 的指针类型来模拟此功能。C 语言没有这种类型,但它可以反过来通过使用标准offsetof
宏和指针算法来模拟。
在您的示例中,它可能如下所示。首先,我们准备一个特殊的偏移数组
const size_t TW_OFFSETS[] =
{ offsetof(TWO_WORDS, string1), offsetof(TWO_WORDS, string2) };
这个偏移数组稍后用于组织对结构成员的索引访问
*(char **)((char *) &tw + TW_OFFSETS[i]);
/* Provides lvalue access to either `tw.string1` or `tw.string2` depending on
the value of `i` */
它看起来并不漂亮(尽管可以通过使用宏使它看起来更好),但这就是它在 C 中的方式。
例如,我们可以定义
#define TW_MEMBER(T, t, i) *(T *)((char *) &(t) + TW_OFFSETS[i])
并在代码中使用它
TW_MEMBER(char *, tw, 0) = "Hello";
TW_MEMBER(char *, tw, 1) = "World";
for (int i = 0; i < 2; ++i)
printf("%s\n", TW_MEMBER(char *, tw, i));
请注意,这种方法不存在基于将结构重新解释为char*[2]
数组的解决方案中存在的严重问题(无论它是通过联合还是通过强制转换完成的)。后者是一种 hack,从形式上看是非法的,通常是无效的。基于-offsetof
的解决方案是完全有效和合法的。