2012-09-21 73 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,如果條件現在 –