2013-05-28 25 views
1

我有一個動態數組ADT其元素類型爲void *如何在同一程序中重複使用具有不同typedef的同一段C代碼?

// In dyn_array.h 
typedef void* element; 
void append(array *a, element e); 
inline void set(array *a, int i, element e); 
... 
// dyn_array.c contains the implementation 

並且這在我的程序的許多地方使用。當我將新功能添加到程序中時,現在我需要一個具有int元素而不是void *的動態數組。我知道其中一個解決方案可能是製作dyn_arrayi.h和dyn_arrayi.c,其內容幾乎與dyn_array.h和dyn_array.c相同,除了typedef語句和函數的名稱。但對我來說,這似乎並不是一個優雅的解決方案,因爲我顯然無意義地重複着自己。

有沒有更好的解決方案,以便我不需要重複自己?也許編譯不同版本的目標代碼?你會如何做到這一點?謝謝。

+1

元素是void *現在如果你有整數,並且想要使用相同的函數,你可以傳遞整數來代替void *。 –

+0

我建議你閱讀這篇文章:http://stackoverflow.com/questions/11164621/templating-in-c-using-the-preprocessor –

+0

@Dayalrai不幸的是,在我真正的代碼中,我實際上是想存儲一個結構。感謝提到這一點;-) –

回答

1

這是C++比C支持更好的一種東西嗎?您可以考慮C++嗎?

總之,在C你可以這樣做:首先定義dyn_array_generic.c等代替void*使用ARRAY_TYPE和使用合適的宏添加在FUNC_POSTFIX定義爲每個功能名稱的功能後綴,則在dyn_array.c等做到這一點:

#define ARRAY_TYPE void* 
#define FUNC_POSTFIX 
#include "dyn_array_generic.c" 
#undef FUNC_POSTFIX 
#undef ARRAY_TYPE 

和dyn_arrayi.c等做到這一點:

#define ARRAY_TYPE int 
#define FUNC_POSTFIX _int 
#include "dyn_array_generic.c" 
#undef FUNC_POSTFIX 
#undef ARRAY_TYPE 

#undef不嚴格需要我只是覺得它更清晰。

0

已經嘗試宏?

你可以嘗試一個簡單的#ifdef

#define DEFINE_MY_TYPE(tp) \ 
typedef (tp) elem; 

#define FUNCTION_APPEND(func_name) \ 
void func_name(array *a, elem e); 


#define FUNCTION_SET(func_name) \ 
void func_name(array *a, elem e); 

#ifdef USE_INT 
DEFINE_MY_TYPE(int) 
#elif USE_VOID 
DEFINE_MY_TYPE(void *) 
#endif 

您可以用宏定義整個功能。

#define FUNCTION_APPEND(func_name) \ 
void func_name(array *a, elem e){ \ 
    int a,b,c, \ 
    ...  \ 
    return 0; \ 
} 

FUNCTION_APPEND(append_int) 

int main (int argc, char *argv[]){ 
{ 
    .... 
    append_int(NULL, 0); //using function defined with MACRO 
    ... 
    return 0; 
} 

或者,根據你打算如何使用這些宏,你可以試試X宏技術(http://en.wikipedia.org/wiki/X_Macro),但谷歌獲得更多信息之前使用它。

+0

FUNCTION_APPEND(append_int)和FUNCTION_APPEND(append_voidp)除了函數名稱外,都會生成完全相同的代碼。這意味着他們正在使用相同的'elem'類型。由於對typedef的重新定義是非法的,所以我不能同時使用這種方法同時獲得兩個版本的工作。我對麼? :-) –

+0

是的,你是對的。但是你可以在宏中添加第二個參數來替換元素類型。如果您想在代碼中使用相同的typedef,只需創建這些類型的聯合。 –

相關問題