該解決方案使用NULL終止的查找表(LUT),以找到合適的尺寸。然後分配該大小的內存。然後將輸入數據複製到新對象。如果對象類型的數量足夠大,則可以對LUT進行預分類,然後執行二分搜索而不是線性搜索。
#include<stdlib.h>
#include<string.h>
struct nameToSize_s {
const char *name;
size_t size;
};
struct foo1_name_s {
};
struct foo2_name_s {
};
const struct nameToSize_s nameToSizeLUT[] = {
{ "foo1_name", sizeof(struct foo1_name_s) },
{ "foo2_name", sizeof(struct foo2_name_s) },
// NULL terminator
{ NULL, 0}
};
void * update(char* name, void *data) {
const struct nameToSize_s *entry = nameToSizeLUT;
while(entry->name) {
if(strcmp(entry->name, name) == 0) break;
entry++;
}
if(entry->name == NULL) abort();
void *newObj = malloc(entry->size);
if(newObj == NULL) abort();
return memcpy(newObj, data, entry->size);
}
函數名稱的哈希表。 –
如果'name'是一個使用宏的常量字符串,你可以這樣做。預處理器在編譯器本身之前運行,所以宏不會對任何變量的動態值進行字符串化或測試。 – nneonneo
當你動態地說,這意味着在運行時?還是編譯時間?我在想前者,如果是的話,你倒黴了:這不是C的工作原理。 – netcoder