2012-09-21 41 views
1

我必须写接收该消息的名称和无效*到该消息的数据的功能update(char* name, void* data);。数据的类型总是固定为“xxx_name”,具体取决于名称。如何动态生成C类型?

我的功能应做到以下几点: -

  1. 生成函数内xxx_name的类型的新的结构。
  2. 复制从指针数据大小xxx_name的,到一个新的位置的数据,作为数据将很快通过外部接口被释放。

在我的情况下,类型xxx_name的可能结构的列表非常大并且分散,因此编写if/else或switch条件是不成问题的。

有没有办法通过一些宏观/字符串化操作等做到这在C?

+1

函数名称的哈希表。 –

+0

如果'name'是一个使用宏的常量字符串,你可以这样做。预处理器在编译器本身之前运行,所以宏不会对任何变量的动态值进行字符串化或测试。 – nneonneo

+0

当你动态地说,这意味着在运行时?还是编译时间?我在想前者,如果是的话,你倒霉了:这不是C的工作原理。 – netcoder

回答

0

该解决方案使用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); 
} 
+0

我同意,但我仍然必须键入所有foo1_name等? –

+0

或编写一个脚本来生成表格。有人必须建立表格。 – James

+0

我写了脚本,现在我得到这个 致命错误C1026:解析器堆栈溢出,程序太复杂。 我使用VC++ 98 我通过,如果条件简单写: - 有接近5000,如果条件现在 –