2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
接口庫(kù)是一種概念,主要看你說(shuō)的是哪方面的了。C和C++都有自己的標(biāo)準(zhǔn)庫(kù)函數(shù),有的人稱之為接口庫(kù),但真正的接口庫(kù)概念并非如此。
真正接口庫(kù)的概念是源自于一個(gè)設(shè)計(jì)理念,就是接口與實(shí)現(xiàn)分離。簡(jiǎn)單的講,假設(shè)有一個(gè)第三方庫(kù)叫A,我的應(yīng)用使用了A,如果A不是接口與實(shí)現(xiàn)分離的話,那么只要A有一點(diǎn)變動(dòng),我的應(yīng)用也需要重新編譯和生成。這樣的話,對(duì)于應(yīng)用庫(kù)A的人來(lái)說(shuō)就會(huì)很麻煩。所以,逐漸的程序設(shè)計(jì)開(kāi)始向著接口與實(shí)現(xiàn)分離的方向發(fā)展了。這也是面向?qū)ο?/a>逐漸延伸出來(lái)的概念。

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
將 C++ 函數(shù)聲明為``extern "C"''(在你的 C++ 代碼里做這個(gè)聲明),然后調(diào)用它(在你的 C 或者 C++ 代碼里調(diào)用)。例如:
// C++ code:
extern "C" void f(int);
void f(int i)
{
// ...
}
然后,你可以這樣使用 f():
/* C code: */
void f(int);
void cc(int i)
{
f(i);
/* ... */
}
當(dāng)然,這招只適用于非成員函數(shù)。如果你想要在 C 里調(diào)用成員函數(shù)(包括虛函數(shù)),則需要提供一個(gè)簡(jiǎn)單的包裝(wrapper)。例如:
// C++ code:
class C
{
// ...
virtual double f(int);
};
extern "C" double call_C_f(C* p, int i) // wrapper function
{
return p->f(i);
}
然后,你就可以這樣調(diào)用 C::f():
/* C code: */
double call_C_f(struct C* p, int i);
void ccc(struct C* p, int i)
{
double d = call_C_f(p,i);
/* ... */
}
如果你想在 C 里調(diào)用重載函數(shù),則必須提供不同名字的包裝,這樣才能被 C 代碼調(diào)用。例如:
// C++ code:
void f(int);
void f(double);
extern "C" void f_i(int i) { f(i); }
extern "C" void f_d(double d) { f(d); }
然后,你可以這樣使用每個(gè)重載的 f():
/* C code: */
void f_i(int);
void f_d(double);
void cccc(int i,double d)
{
f_i(i);
f_d(d);
/* ... */
}
注意,這些技巧也適用于在 C 里調(diào)用 C++ 類庫(kù),即使你不能(或者不想)修改 C++ 頭文件。
- 2 回答
- 0 關(guān)注
- 986 瀏覽
添加回答
舉報(bào)