回答
我覺得這個例子使得答案明確:
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