為什麼需要extern 「c」?
extern 「c」 是編譯器鏈結指示符。需要知道,對於不同的編譯器,在編譯乙個函式時,編譯出來的函式名稱或引數排列的順序可能是不同的。這就導致用一種語言去呼叫另一種語言函式的時候,需要告訴編譯器不同的編譯器呼叫規則。extern 「c」就是告訴編譯器用c語言的規則去編譯呼叫函式。
extern "c"有兩種宣告形式,一種是單一語句形式,如:
extern
"c"int add(int x,int y);
另一種復合語句形式,如:
extern
"c"
下面來看乙個例子,以便更詳細地說明extern 「c」的意義所在:
#ifdef _cplusplus
extern "c"
#endif
_cplusplus是c++中的自定義巨集,表明當前**是一段c++**。則這裡表示:如果當前**是c++**,那麼就用c語言的規則來編譯這段**。
例項:c++中呼叫c函式。
a.c
1
#include 23
extern
"c"4
10 }
b.cpp
1
extern
"c"2
56int main()
7
編譯執行得:
[ch1n4@localhost extern]$ g++ a.c b.cpp -o b
[ch1n4@localhost extern]$ ./b
hello
c中呼叫c++函式
在c中引用c++語言中的函式和變數時,c++的標頭檔案需要新增extern 「c」,但是在c語言中不能直接引用宣告了extern 「c」的標頭檔案,應該僅將c檔案中在c++中定義的extern 「c」函式宣告為extern型別。
例項:example.h
1
#ifndef example_h
2#define example_h
3extern
"c"int add(int x,int y);
4#endif
example.cpp
1
#include "example.h"23
int add(int x,int y)
4
cfile.c
1
extern
int add(int x,int y);
23int main(int argc,char* argv)
4
在c語言中不能直接引用宣告了extern 「c」的標頭檔案。比如在cfile.c中不能加上語句#include 「example.h」,應該僅在c檔案中將c++中定義的extern」c」函式宣告為extern型別,然後在**中呼叫該函式。
編譯執行:
[ch1n4@localhost extern]$ g++ -c example.cpp -o example.o
[ch1n4@localhost extern]$ gcc -c cfile.c -o cfile.o
[ch1n4@localhost extern]$ gcc cfile.o example.o -lstdc++
[ch1n4@localhost extern]$ ./a.out
正常表示呼叫成功。 TextOutA函式與TextOutW函式
這仍然是在學習字元編碼的時候引出來的。原意是感覺字元編碼既然這麼普遍地存在,那麼作業系統又是如何做的呢?所以想到要除錯一下textouta函式,看看它輸出文字的時候是怎樣對付字元編碼問題的。最後的結果是 textouta實際上是封裝了乙個另外的函式呼叫。textouta的流程大概是這個樣子 bool...
sort函式用法與stable sort函式
標頭檔案 include algorithm using namespace std 語法 sort start,end,cmp 注意 第三個引數cmp公升序情況下可以不寫,降序情況需要多呼叫乙個函式 例如 對a 10 陣列公升序排列 include include using namespace ...
C 虛函式與函式過載理解分析
虛函式構建多型,函式過載通過以下方式 1,const過載 2,形參表 虛函式子類中,不能出現返回值不同的情況,除非返回值可以向上轉換 常物件優先呼叫const過載函式,非常物件優先呼叫普通函式 以以下例子分析 class sbs class base使用的是基本物件,而不是常物件,預設呼叫virtu...