理解extern C ,C 函式與C函式互調

2021-06-29 00:13:25 字數 1842 閱讀 3759

為什麼需要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...