1. 程式人生 > >在c++程式中呼叫被c編譯器編譯後的函式,為什麼要加extern "c"?

在c++程式中呼叫被c編譯器編譯後的函式,為什麼要加extern "c"?

首先,被它修飾的目標是“extern”的。也就是告訴編譯器,其宣告的函式和變數可以在本模組或其他模組中使用。通常,在模組的標頭檔案中對本模組提供給其他模組引用的函式和全域性變數以關鍵字extern宣告。

其次,被它修飾的目標是“c”,意思是其修飾的變數和函式是按照c語言方式編譯和連線的。我們來看看c++中對類似c的函式是怎樣編譯的。作為一種面向物件的語言,c++支援過載,而過程式語言c則不支援。函式被c++編譯後在符號庫中的名字與c語言的不同。例如下面兩個函式:

1 void foo(int x,int y);

2 void foo(int x,float y);

這個函式編譯生成的符號是不相同的,前者可能為_foo_int_int型,後者為_foo_int_float型,這樣的名字包含了函式名、函式引數數量及型別資訊,c++就是靠這種機制來實現函式過載的。這樣,如果在c中連線c++編譯的符號時,就會因為找不到符號問題發生連線錯誤。

如果加extern"c"聲明後,模組編譯生成foo的目的碼時,就不會對其名字進行特殊處理,採用了c語言的方式,也就是_foo之類,不會加上後面函式引數數量及型別資訊相關的一串。因此extern"c‘’是c++編譯器提供的與c連線交換指定的符號,用來解決名字匹配問題。