C中為什么不支持重載,即同一作用域內不允許出現同名函數?
我們都知道重載是c++面向對象的特性。c語言中是不存在的。所謂重載簡單來說就是一個函數名可以實現不同的功能,要么輸入參數不同或者參數個數不同,要么返回類型不同。例如函數add(),在c++中可以輕易實現int,double等不同類型參數的相加功能,而在c語言中卻不能這樣實現。c語言中實現重載功能,或者准確來說是類似重載的功能,可以通過函數指針的方式來實現。
函數指針定義
形式1:函數類型 (*指針變量名)(形參列表);
“函數類型”說明函數的返回類型,由於“()”的優先級高於“*”,所以指針變量名外的括號必不可少,后面的“形參列表”表示指針變量指向的函數所帶的參數列表
形式2:typedef函數類型 (*指針變量名)(形參列表);
區別: typedef的功能是定義新的類型。后面可以用新類型定義函數指針變量,第一種只能用定義函數指針時的名字。
例如:
1 int func(int x); /* 聲明一個函數 */
int (*f) (int x); /* 聲明一個函數指針 */
f=func; /* 將func函數的首地址賦給指針f */
2 int func(int x); /* 聲明一個函數 */
int (*f) (int x); /* 聲明一個函數指針 */
f fa;
fa=func; /* 將func函數的首地址賦給指針f */
函數指針賦值:賦值時函數func不帶括號,也不帶參數,由於func代表函數的首地址,因此經過賦值以后,指針f就指向函數func(x)的代碼的首地址。
函數指針調用:
(*f)();
f(x);
函數調用的時候可以使用函數指針的方式,也可以使用函數指示符的方式。不過,后者會由編譯器自動轉換為前者的形式,即函數指針的形式。和指向對象的指針相比,這是函數指針一個比較特殊的地方。
區別指針函數:一個函數不僅可以帶回一個整型數據的值,字符類型值和實型類型的值,還可以帶回指針類型的數據,使其指向某個地址單元。
類型標識符 *函數名(參數表) int *f(x,y);
#include <stdio.h> typedef struct _int_param { int param1; int param2; }INT_PARAM; typedef struct _double_param_ { double param1; double param2; }DOUBLE_PARAM; typedef void* (*ADDFUNC)(void*); void* int_add_func(void* wParam) { INT_PARAM* lParam = (INT_PARAM*)wParam; int res = lParam->param1 + lParam->param2; return (void*)&res; } void* double_add_func(void* wParam) { DOUBLE_PARAM* lParam = (DOUBLE_PARAM*)wParam; double res = lParam->param1 + lParam->param2; return (void*)&res; } void* add_func(ADDFUNC f, void* wParam) { return f(wParam); } int main() { INT_PARAM val1 = {10, 20}; DOUBLE_PARAM val2 = {30.5, 40.5}; void* res1 = add_func(int_add_func, &val1); int result1 = *((int*)res1); void* res2 = add_func(double_add_func, &val2); double result2 = *((double*)res2); printf("%d %f",result1,result2); return 0; }
這種方法的局限性:模擬的重載函數參數個數必須是相同的切返回值相同。因為定義的是一個函數指針,函數指針定義就明確了其參數個數返回值。