part1:
c++和c是程式語言的雙星,c++到c是物件導向語言到面向過程的跨越,但是他們確是兩種完全
不同的編譯鏈結處理方式
,如果直接在c++裡面呼叫c函式,會找不到函式體,報鏈結錯誤。要解決這個問題,就要在 c++檔案裡面顯示宣告一下哪些函式是c寫的,要用c的方式來處理。
part2:
extern "c" 是c++語言,包含
雙重含義
:首先,被它修飾的目標是"extern"的;其次,被它修飾的目標是"c"的。
(1) 被extern限定的函式或變數是extern型別的:
a.extern修飾變數的宣告。舉例來說,如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告externint v,然後就可以引用變數v。
b.extern修飾函式宣告。從本質上來講,變數和函式沒有區別。
(2) 被extern "c"修飾的變數和函式是按照c語言方式編譯和連線的;
part3:
情況如下:
a.呼叫標頭檔案【如果引用多個】
extern 「c」
;然後在呼叫這些函式之前,需要將函式也全部宣告一遍。
b.呼叫函式,將用到的函式全部重新宣告一遍
extern 「c」
part4:
c++程式中呼叫被c編譯器編譯後的函式,為什麼要加extern "c"?
c++語言支援函式過載,c語言不支援函式過載。函式被c++編譯後在庫中的名字與c語言的不同。假設某個c 函式的宣告如下:
void foo(int x, int y);
該函式被c 編譯器編譯後在庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字用來支援函式過載和型別安全連線。由於編譯後的名字不同,c++程式不能直接呼叫c 函式。c++提供了乙個c 連線交換指定符號extern「c」來解決這個問題。例如:
extern 「c」
或者寫成
extern 「c」
這就告訴c++編譯譯器,函式 foo 是個c 連線,應該到庫中找名字_foo 而不是找_foo_int_int。c++編譯器開發商已經對c 標準庫的標頭檔案作了extern「c」處理,所以我們可以用#include 直接引用這些標頭檔案。
昂貴的聘禮
時間限制 1000 ms 記憶體限制 10000 kb 難度 4 描述 年輕的探險家來到了乙個印第安部落裡。在那裡他和酋長的女兒相愛了,於是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這麼多金幣,便請求酋長降低要求。酋長說 嗯,如果你能夠替我弄到大祭司的皮襖,我...
昂貴的聘禮
description 年輕的探險家來到了乙個印第安部落裡。在那裡他和酋長的女兒相愛了,於是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這麼多金幣,便請求酋長降低要求。酋長說 嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要8000金幣。如果你能夠弄來他的水晶球,...
昂貴的聘禮
年輕的探險家來到了乙個印第安部落裡。在那裡他和酋長的女兒相愛了,於是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這麼多金幣,便請求酋長降低要求。酋長說 嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要8000金幣。如果你能夠弄來他的水晶球,那麼只要5000金幣就行...