该解决方案使用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