C語言學習之extern C

2021-06-21 11:43:05 字數 1330 閱讀 2584

extern "c"的主要作用就是為了能夠正確實現c++**呼叫其他c語言**。加上extern "c"後,會指示編譯器這部分**按c語言的進行編譯,而不是c++的。由於c++支援函式過載,因此編譯器編譯函式的過程中會將函式的引數型別也加到編譯後的**中,而不僅僅是函式名;而c語言並不支援函式過載,因此編譯c語言**的函式時不會帶上函式的引數型別,一般之包括函式名。

這個功能十分有用處,因為在c++出現以前,很多**都是c語言寫的,而且很底層的庫也是c語言寫的,為了更好的支援原來的c**和已經寫好的c語言庫,需要在c++中盡可能的支援c,而extern "c"就是其中的乙個策略。

這個功能主要用在下面的情況:

1、c++**呼叫c語言**

2、在c++的標頭檔案中使用

3、在多個人協同開發時,可能有的人比較擅長c語言,而有的人擅長c++,這樣的情況下也會有用到

下面給出乙個例子:

modulea、moduleb兩個模組,b呼叫a中的**,其中a是用c語言實現的,而b是利用c++實現的,下面給出一種實現方法:

1、//modulea標頭檔案

#ifndef __module_a_h //對於模組a來說,這個巨集是為了防止標頭檔案的重複引用

#define __module_a_h

int fun(int, int);

#endif

2、//modulea實現檔案modulea.c //模組a的實現部分並沒有改變

#include"modulea"

int fun(int a, int b)

//moduleb標頭檔案

#idndef __module_b_h //很明顯這一部分也是為了防止重複引用

#define __module_b_h

#ifdef __cplusplus //而這一部分就是告訴編譯器,如果定義了__cplusplus(即如果是cpp檔案, extern "c"

#endif

#endif

//moduleb實現檔案 moduleb.cpp //b模組的實現也沒有改變,只是標頭檔案的設計變化了

#include"moduleb.h"

int main()

下面是詳細的介紹:

由於c、c++編譯器對函式的編譯處理是不完全相同的,尤其對於c++來說,支援函式的過載,編譯後的函式一般是以函式名和形參型別來命名的。例如函式void fun(int, int),編譯後的可能是(不同編譯器結果不同)_fun_int_int(不同編譯器可能不同,但都採用了類似的機制,用函式名和引數型別來命名編譯後的函式名);而c語言沒有類似的過載機制,一般是利用函式名來指明編譯後的函式名的,對應上面的函式可能會是_fun這樣的名字。

C語言學習之常量

1.整型常量 像123這一型別常量如無特別說明都是int型別常量。long型常量要以l或l結尾,比如123456789l。無符號常量要以u或u結尾。整型常量除了用十進位制表示外,還可以用八進位制和十六進製制表示,八進位制前面加0 零 十六進製制前面加0x。2.字元常量 字元常量用 表示,比如 y 本...

C語言學習之 結構

資料型別 基本資料型別 構造資料型別 構造資料型別 e.g.陣列 儲存多個同種型別資料,結構 儲存多個不同型別資料。定義結構 struct 結構名 struct student 定義變數 struct student alice,bob 定義了結構體變數alice,bob。or使用巨集定義用乙個符號...

C語言學習之陣列

一維陣列的定義方式 資料型別 陣列名 整型常量表示式 注意 方括號中只能是常量表示式,不能使用變數。常量表示式的值表示陣列最多能存放的元素的個數,也稱為陣列的大小 陣列所佔總位元組數 sizeof 資料型別 陣列大小 int k 5 float c k 不合法,k是變數 define m 20 in...