◎Abstract
在C++程式中,有時會呼叫其它程式語言所寫的函式,本文將會以: 如何在C++程式中呼叫「C」語言的函式為例子,來說明Linkage Directives — 「extern」的使用方法、時機,以及一些使用上該注意的事項。
◎Declaring a Non-C++ Function
有兩種方式可以在C++中宣告C函式 — 「single」、「compound」。如果單獨宣告某個函式或變數則使用single的用法;反之,當宣告兩個以上的函式或變數時,則使用compound的用法。使用方法分別如下:
- single
// single statement linkage directive extern "C" int func(int);
- compound
// compound statement linkage directive extern "C" { int func(int); double var; }
◎Compatibility between C/C++ compiler
為了讓C++的compiler可以引用C語言的一些函式,並且不影響原本C語言compiler的處理,也就是,使C與C++的compiler能夠「相容」,我們常常可以在C語言的系統標頭檔、函式庫看到以下這種用法
#ifdef __cplusplus extern "C" { #endif int func(int); #ifdef __cplusplus } #endif
它代表的是,如果編譯的是C++程式碼,則函式「func」會使用「extern "C"」來宣告; 如果是C程式碼,則直接宣告
※ 當我們使用C++編譯時,__cplusplus會被自動定義
我們都知道,C++支援「Function Overloaded」,而C語言並不支持。因此,在C++ Primer(Ref.1)中有底下這麼一題練習題
Exercise18.34:答案是:
Explain these declarations and indicate whether they are legal:
extern "C" int compute(int *, int);
extern "C" double compute(double *, double);
- 如果其中一個宣告單獨出現,那麼會是沒問題的
- 但是,當兩個宣告一起出現的話,就會因為C語言不支持「Function Overloaded」而產生錯誤
◎Reference
- C++ Primer, 4th Edition, S. B. Lippman, J. Lajoie and B. E. Moo
- 程式設計師的自我修養 — 連結、載入、程式庫,俞甲子、石凡、潘愛民
- http://en.wikipedia.org/wiki/Name_mangling