回答
我觉得这个例子使得答案明确:
struct test
{
int b;
int a;
};
int main()
{
test t;
test* structp = &t;
//Find the byte offset of 'a' within the structure
int offsetf = offsetof(test, a);
//Set the value of 'a' using pointer arithmetic
*(int *)((char *)structp + offsetf) = 5;
return 0;
}
我认为值得指出的是,“名称”(a)在这里是一个编译时符号,而不是“在运行时”找到的东西。在后一种情况下,它必须是一个字符串,并且offsetof()不起作用。 – unwind 2010-03-25 15:13:12
你不能,没有实现某种名称查找自己。
程序运行时C没有任何时间留下名称信息。
通常为不同的结构体字段类型提供支持是很复杂的。
记录使用offsetof()宏计算的字段偏移量。如果structp是指向该结构的一个实例,字段f是具有偏移offsetf一个int中,f的值可以间接地与
*(int *)((char *)structp + offsetf) = value;
设置如果结构是使用struct {...}
定义中所定义,这是不可能的会在可执行代码中涉及到成员名称中的任何信息。一些平台在生成的可执行文件中构建“调试”信息,并且可能有一些方法可用于正在运行的程序检索该信息,但没有常见的方法来执行此类操作。
然而,人们可以做的是使用宏来定义一个结构。例如,一个可以定义:
#define MAKE_ACME_STRUCT \
FIELD(id,int,23) \
X FIELD(name,char30,"Untitled") \
X FIELD(info,int,19) \
// LEAVE THIS COMMENT HERE
,然后调用MAKE_ACME_STRUCT宏不同的时间,用领域和X宏定义不同的方法,使得其将扩大要么一个结构声明,或用于初始化表达式该结构的“默认”实例,或作为描述结构字段的项目数组的初始化表达式[例如像
STRUCT_INFO acme_struct_info[] = {
{"id", STRUCT_INFO_TYPE_int, sizeof(ACME_STRUCT.id), offsetof(ACME_STRUCT.id)}
,{"name", STRUCT_INFO_TYPE_char30, sizeof(ACME_STRUCT.name), offsetof(ACME_STRUCT.name)}
,{"info", STRUCT_INFO_TYPE_int, sizeof(ACME_STRUCT.info), offsetof(ACME_STRUCT.info)}
,{0}};
这将是必要的是,结构体中使用的所有类型的具有单令牌名称,并且对于每个这样的名称,标识符STRUCT_INFO_TYPE_nameGoesHere
定义标识所述类型的运行时库在一些它理解的形式。
这样的宏很难看,但它们的优势在于确保它们用来定义的所有东西保持同步[例如,确保添加或删除acme_struct
的元素将导致其添加或删除存储在acme_struct_info
]中的结构成员列表。
- 1. LLVM。如何根据其名称访问结构字段?
- 2. Python:在字符串中通过名称访问结构字段
- 3. 运行时错误:在访问结构
- 4. IDL:使用存储在变量中的字段名称访问结构字段?
- 5. ng-repeat:如何访问字段名称
- 6. Textbox字段名称访问
- 7. PHP在运行时按名称访问子属性
- 8. 如何通过引用数据结构名称来访问其他字段
- 9. 在运行时如何从内存访问C结构成员?
- 10. 当字段名称在变量中时,如何访问类的字段?
- 11. GoLang:访问结构属性的名称
- 12. 访问结构变量的名称
- 13. 如何通过ActiveRecord行结果中的属性名称访问字段?
- 14. 如何动态访问MATLAB中结构的字段字段?
- 15. 如何按名称搜索结构?
- 16. C++运行时字段访问
- 17. 获取结构的字段名称
- 18. 在运行时构造变量名称
- 19. 在运行时访问任何结构体成员
- 20. MapRoute如何访问匿名类型的字段名称?
- 21. 如何访问按钮图像名称?
- 22. 如何按名称访问属性?
- 23. 如何在第三级访问componentlink字段名称?
- 24. 如何在Django中访问ModelForm的字段名称?
- 25. 如何在访问表中使用SQL列出字段名称
- 26. 以唯一名称访问SSRS字段
- 27. 访问变量字段名称
- 28. 在Matlab结构中访问结构中的特定字段
- 29. 按名称访问UserControl(字符串)
- 30. 访问嵌套结构的字段
A是好的,但Q sux。谷歌的“java反思”中,C语言对它没有任何支持。 – 2010-03-25 13:11:48
我知道反射,C支持它通过跳转映射,Java反射,不是我的问题,但仍然感谢。 – drigoSkalWalker 2010-03-25 13:15:35