天天看點

C++中extern "C"和export用法

extern "C":

extern "C"的主要作用就是為了能夠正确實作C++代碼調用其他C語言代碼。加上extern "C"後,會訓示編譯器這部分代碼按C語言的進行編譯,而不是C++的。由于C++支援函數重載,是以編譯器編譯函數的過程中會将函數的參數類型也加到編譯後的代碼中,而不僅僅是函數名;而C語言并不支援函數重載,是以編譯C語言代碼的函數時不會帶上函數的參數類型,一般之包括函數名。

extern "C"一般修飾變量、函數或者一段代碼:

被extern "C"限定的函數或變量是extern類型的;

在C++中引用C語言中的函數和變量,在包含C語言頭檔案(假設為cExample.h)時,需進行下列處理:

extern "C"

{

#include "cExample.h"

}

export:

為了通路其他編譯單元(如另一代碼檔案)中的變量或對象,對普通類型(包括基本資料類、結構和類),可以利用關鍵字extern,來使用這些變量或對象時;但是對模闆類型,則必須在定義這些模闆類對象和模闆函數時,使用标準C++新增加的關鍵字export(導出/出口/輸出)。例如:

extern int n;

extern struct Point p;

extern class A a;

export template<class T> class Stack<int> s;

export template<class T> void f (T& t) {……}

一般是在頭檔案中給出類的定義或全局函數的聲明資訊,而在代碼檔案中給出具體的(類成員函數或全局函數的)函數定義。然後在多個使用者代碼檔案中包含該頭檔案後,就可以使用其中定義或聲明的類和函數。頭檔案中一般不包含變量、結構和類對象的定義,因為這樣可能會導緻重複定義的編譯錯誤。解決辦法是,在某個代碼檔案中進行定義,在其他使用者代碼檔案中用extern來引用它們。

但是對模闆類型,則可以在頭檔案中,聲明模闆類和模闆函數;在代碼檔案中,使用關鍵字export來定義具體的模闆類對象和模闆函數;然後在其他使用者代碼檔案中,包含聲明頭檔案後,就可以使用該這些對象和函數了。

繼續閱讀