2011-09-29 104 views

回答

0

您可以創建並接受union,也可以使用通用的void*指向數據。但是C不支持C++中的模板。

+1

我有一個疑問,要使用調用函數內部的值,我們必須知道從調用函數傳遞的值的數據類型,因爲我們不能使用void指針而不用將其轉換爲正確的數據類型。所以這不是完整的模板。如果有什麼不對,請原諒我。 – Prak

1

關於你可以在C中做的唯一事情是宏,模板的可憐表兄弟。例如:

#define max(a, b) ((a) < (b) ? (b) : (a)) 

注意,這有一個巨大的問題...宏參數進行評估不止一次。例如:

max(i+=1, i); 

擴展爲:

((i+=1) < (i) ? (i+=1) : (i)); 

那表情的結果可能是各種對各種編譯有趣的事情。

因此,宏是模板的真正不好的替代品。你可以使用與他們不可知的類型的'函數'。但他們帶來了一些障礙和陷阱,使他們幾乎沒有任何真正重要的用處。它們也相當「毛茸茸」,讓你的代碼比模板更難理解。

我剛剛給出的max例子可能看起來並不那麼毛茸茸(儘管對參數的加倍評價肯定是令人驚訝且難以處理的東西),但here is an example of declaring something like a templated vector type with macros, and it is obviously hairy

9

這不會很漂亮。以this page爲例。大量的宏觀使用。

+0

+1尼斯鏈接。 :) – Mysticial

+0

你說,如果C++模板是「漂亮」。 ;-) –

+0

@Paul R,他們......更漂亮。 ;) – Zeenobit

0

您可以使用...varargs功能

0

我猜它必須是一個空指針

void *p; 

只是強制轉換和使用它。你問就是爲什麼在C++

介紹閱讀您的評論我想在您需要的參數發送可變

func(void *p, int) \\ second argument must be a datatype use sizeof to find the datatype 
+0

謝謝...是的,使用一個數據類型的字段,我們可以在C中實現一些模板化。 – Prak

+0

但是我想它一定是相當長的代碼,如果它的條件和類型化它:) – niko

+0

@niko:你可以嘗試按照函數需要void指針和大小,比如'memcpy'等。我懷疑'qsort'這樣的函數是通用的。 – visitor

相關問題