Sunday, July 18, 2010

Linkage Directives: extern "C"


◎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會被自動定義


Overloaded Functions
我們都知道,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」而產生錯誤
這是在使用extern "C"」上必須注意的地方

◎Reference
  1. C++ Primer, 4th Edition, S. B. Lippman, J. Lajoie and B. E. Moo
  2. 程式設計師的自我修養 — 連結、載入、程式庫,俞甲子、石凡、潘愛民
  3. http://en.wikipedia.org/wiki/Name_mangling

0 意見: