2012-07-11 51 views
2

我想實現一個類似於c++泛型的函數。除了整數,參數還應該支持char類型,以及任何其他類型。一個類似於C++通用的C函數

void function t(int a[],int len); 

如何在C語言中實現?

+2

在C++中,您有模板。在C語言中,最接近你的是宏... eek。 – Mysticial 2012-07-11 00:47:53

+1

C沒有模板。你想要這個功能做什麼,具體是什麼?請編輯您的問題以包含具體示例。 – 2012-07-11 00:48:08

+0

'void *'是你需要使用的。還有一些聰明(但小心!)的編程。 – 2012-07-11 00:51:55

回答

0

在C語言中這樣做的習慣做法是傳遞void *。但是,您需要額外的信息才能真正做到這一點。

3

既然你沒有模板用C像你這樣的C++你有幾個不同的選擇,這可能是合適的根據手頭的任務:

  • 使用預處理器和創建基本宏,例如您的基本MIN/MAX類型的宏,它只是簡單地包裝幾個<>操作。

  • 編寫不同版本的特定數據類型的函數 - function_int(int...)function_char(char...)

  • 寫一個通用的函數,該函數在數據作爲void*,不知道實現細節,以及函數指針,被作用於數據的函數調用,並知道如何操作這些數據。

    在這種情況下,看像bsearch的函數,其中所述搜索關鍵和陣列是void *類型的,以及比較函數傳遞用於特定類型的數據:

    void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, 
           int (*compar)(const void *, const void *)); 
    

    比較函數是這是唯一需要知道數據類型的代碼片段,因此您只需要編寫函數的通用部分一次。但是,您仍然需要爲每個要操作的數據類型編寫一個函數,就像上面的要點一樣。

2

這是一種我相信在書C Unleashed中描述的技術。這本書大概比我能夠從記憶中複製出來的更優雅一些。

你可以有一個包含文件是這樣的:

/* function.tmpl */ 
#ifndef FUNCTION 
#define FUNCTION_PASTE(X,Y) X ## _ ## Y 
#define FUNCTION(X) FUNCTION_PASTE(function, X) 
#endif 

void FUNCTION(TYPE) (TYPE a[], int len) { 
    /* do something */ 
} 

然後,可像這樣:

#define TYPE int 
#include "function.tmpl" 
#undef TYPE 

#define TYPE double 
#include "function.tmpl" 
#undef TYPE 

和通話功能是這樣的:

int a[4]; 
FUNCTION(int)(a, 4); 

double b[5]; 
FUNCTION(double)(b, 5); 
+0

哇,太棒了。我會玩。我懷疑typeof(http://gcc.gnu.org/onlinedocs/gcc/Typeof.html)運算符在這裏可能非常有用。 – Jack 2012-07-11 01:30:33

+0

忽略評論的類型。它並不像我預期的那樣工作..這個操作符僅限於指定:'typeof(a)foo = ..;' – Jack 2012-07-11 01:36:17

+0

@Jack:我自己並沒有想到它。這是我在很久以前翻閱的一本書中描述的。我已經用書名更新了答案。謝謝你提醒我。問候 – jxh 2012-07-11 02:00:41

0

你可以嘗試這樣的事情:

enum data_type { CHAR_TYPE, INT_TYPE }; 

void function t(void* buf, size_t len, enum data_type type) { 
    int* int_ary; 
    char* char_ary; 

    if (type == CHAR_TYPE) { 
     char_ary* = buf; 
     ... 
    } else if (type == INT_TYPE) { 
     int_ary* = buf; 
     ... 
    } 
} 

它很容易出錯而且容易出錯,但它可以工作。它不完全像C++,因爲它是一種統一的功能,而不是每種類型的獨立版本。