C用函數指針模擬重載 C++重載


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;
 }

這種方法的局限性:模擬的重載函數參數個數必須是相同的切返回值相同。因為定義的是一個函數指針,函數指針定義就明確了其參數個數返回值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM