2012軟考程序員輔導(dǎo):C中如何調(diào)用C++函數(shù)

字號:

C中如何調(diào)用C++函數(shù)?
    前陣子被問及一個在C中如何調(diào)用C++函數(shù)的問題,當(dāng)時簡單回答是將函數(shù)用extern"C"聲明,當(dāng)被問及如何將類內(nèi)成員函數(shù)聲明時,一時語塞,后來網(wǎng)上查了下,網(wǎng)上有一翻譯C++之父的文章可以作為解答,遂拿來Mark一下。
    將C++函數(shù)聲明為``extern"C"''(在你的C++代碼里做這個聲明),然后調(diào)用它(在你的C或者C++代碼里調(diào)用)。例如:
    //C++code:
    extern"C"voidf(int);
    voidf(inti)
    {
    //…
    }
    然后,你可以這樣使用f():
    /*Ccode:*/
    voidf(int);
    voidcc(inti)
    {
    f(i);
    /*…*/
    }
    當(dāng)然,這招只適用于非成員函數(shù)。如果你想要在C里調(diào)用成員函數(shù)(包括虛函數(shù)),則需要提供一個簡單的包裝(wrapper)。例如:
    //C++code:
    classC
    {
    //…
    virtualdoublef(int);
    };
    extern"C"doublecall_C_f(C*p,inti)//wrapperfunction
    {
    returnp->f(i);
    }
    然后,你就可以這樣調(diào)用C::f():
    /*Ccode:*/
    doublecall_C_f(structC*p,inti);
    voidccc(structC*p,inti)
    {
    doubled=call_C_f(p,i);
    /*…*/
    }
    如果你想在C里調(diào)用重載函數(shù),則必須提供不同名字的包裝,這樣才能被C代碼調(diào)用。例如:
    //C++code:
    voidf(int);
    voidf(double);
    extern"C"voidf_i(inti){f(i);}
    extern"C"voidf_d(doubled){f(d);}
    然后,你可以這樣使用每個重載的f():
    /*Ccode:*/
    voidf_i(int);
    voidf_d(double);
    voidcccc(inti,doubled)
    {
    f_i(i);
    f_d(d);
    /*…*/
    }
    注意,這些技巧也適用于在C里調(diào)用C++類庫,即使你不能(或者不想)修改C++頭文件。