1

我必须编写一个函数update(char* name, void* data);来接收消息的名称和 void* 到该消息的数据。数据的类型始终固定为“xxx_name”,具体取决于名称。

我的功能应该执行以下操作:-

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

就我而言,xxx_name 类型的可能结构列表非常庞大且分布广泛,因此编写 if/else 或 switch 条件是没有问题的。

有没有办法通过一些宏/字符串化运算符等在 C 中做到这一点?

4

1 回答 1

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);
}
于 2012-09-21T00:55:48.940 回答