用C語言能不能實現一個通用的函數,既能完成整數的相加,又能完成浮點數的相加?
放在C語言里面,確實比較困難。
我們先來看看C++的解決方案。
#includetemplate T add(T x, T y) { return x + y; } int main() { std::cout << add (1, 2) << std::endl; //顯式調用 std::cout << add(1.1, 2.2) << std::endl; //隱式調用 return 0; }
C++有個重要的概念叫做模板,所謂模板,就是通用的意思。
不管是整數的相加,還是浮點數的相加,代碼都是一樣的,唯一的區別就是類型,參數的類型以及返回值的類型。
那就干脆用一種通用的類型來代替,這個類型暫且就叫 T。
這樣的代碼如果直接拿來編譯,編譯器肯定會提示 T 這種類型不能識別,畢竟它不是標準的類型。
所以還需要在上面加一行代碼,專門告訴編譯器,T 是一種類型。
調用函數的時候,可以顯示指定類型,也可以讓編譯器自己去分析,這就是 C++ 中的函數模板。
單從功能上來說,確實給用戶提供了極大的方便。
再回到C語言上,C語言并沒有函數模板的概念,唯一能接近函數模板的方式,可能就是使用 _Generic 關鍵字。
#includeint add_int(int x, int y) { return x + y; } double add_double(double x, double y) { return x + y; } #define ADD(X, Y) _Generic((X), int : add_int(X, Y), double : add_double(X, Y)) int main() { printf("%d ", ADD(1, 2)); printf("%lf ", ADD(1.1, 2.2)); return 0; }
?Generic 關鍵字可以判斷參數 x 的類型,根據類型去匹配相應的函數,如果不看這些代碼,從使用的角度,確實有點函數模板的意思。
-
C語言
+關注
關注
180文章
7604瀏覽量
136685 -
函數
+關注
關注
3文章
4327瀏覽量
62569 -
C++
+關注
關注
22文章
2108瀏覽量
73618
原文標題:C語言實現函數模板
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論