老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

C與C++接口函數相互調用的實現

一、C 或 C++ 編譯的四個步驟

新源網站制作公司哪家好,找創新互聯!從網頁設計、網站建設、微信開發、APP開發、響應式網站等網站項目制作,到程序開發,運營維護。創新互聯自2013年創立以來到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創新互聯

(一) 預處理

在該步驟中,編譯器將源程序中以“#”開頭的語句進行處理。其中,#include 的原理是將目標文件內容導入本文件。

(二) 編譯

在該步驟中,編譯器將第一步生成的各個文件分別轉換成匯編語言文件。在該過程中,所有函數的名稱都會被轉換成一個符號作為匯編文件中的唯一標識,對 C 語言函數一般直接用函數名稱作為其唯一標識的符號,而對于 C++ 函數在多數情況下需要在函數名稱加上各種前綴或后綴才能作為其標識,比如函數 void Print(int num),如果編譯器將其視為 C 語言編譯,則該函數在匯編文件中的符號為 Print,若視為 C++,則其符號可能為 Print_int(在 gcc 或 g++ 中函數名稱的改變還會考慮命名空間等因素),這也是 C++ 支持函數重載的原因。

(三) 匯編

在該步驟中,編譯器將第二步生成的各個文件分別轉換為二進制文件,但還不是可執行文件。

(四) 鏈接

在該步驟中,編譯器會為第三步生成的每一個文件“穿針引線”,比如 main() 函數中調用了 Print() 函數,還不知道 Print() 函數在哪里,而在 Print() 函數主體所在的那個文件中,已經標明了 Print() 函數的地址,所以編譯器會在 main() 函數中調用 Print() 函數的地方標注 Print() 函數的地址,為程序執行過程中的地址跳轉提供目標地址,而編譯器能做到這一步的前提,是 main() 函數中 Print() 函數的標識,和 Print() 函數主體所在的那個文件中 Print() 函數的標識是一模一樣的,如果不一樣,就會觸發鏈接錯誤。

二、C 與 C++ 接口相互調用的關鍵

從上文可以得知,要調用一個函數有一個重要條件就是調用處的符號和函數主體處的符號要一模一樣,而 C 和 C++ 在編譯過程中將函數名稱改編成標識符號的方法是不一樣的,因此相互調用的關鍵在于統一接口函數的標識符號,而一般采取的方法是,用 C 函數改編的方法統一接口函數的改編方式。

三、extern "C"

extern "C" 的作用是告訴編譯器按 C 函數名稱改編的方法將修飾的函數改編成標識符號。extern "C" 一般用在 C++ 文件中。

extern "C" void Print(int num);
extern "C" {
 void Input(int* num);
 void Output(int num);
};

以上是 extern "C" 的兩種寫法。如此一來,以上三個函數都會按 C 的方式被改編成符號,在 gcc 或 g++ 編譯下就會被改變成 Print,Input,Output。

四、C 函數調用 C++ 接口

(一) 調用非成員函數

被調用函數的聲明和定義如下。

/**
 * called.h
 */
#ifndef CALLED_H
#define CALLED_H

extern "C" void PrintCpp(void);

#endif

/**
 * called.cpp
 */
#include 
#include "called.h"

using namespace std;

void
PrintCpp(void) {
 cout << "I\'m cpp." << endl;
}

最終調用如下。

/**
 * call.c
 */
#include "called.h"

int
main(int argc, char const* argv[]) {
 PrintCpp();
 return 0;
}

(二) 調用類成員函數(接口函數沒有類指針)

被調用函數聲明和定義如下。

/**
 * called.h
 */
#ifndef CALLED_H
#define CALLED_H

class Console {
public:
 Console();
 virtual void PrintDouble(double num);
};

extern "C" void CppPrintDouble(double num);

#endif
/**
 * called.cpp
 */
#include 
#include "called.h"

using namespace std;

Console::Console() {}

void
Console::PrintDouble(double num) {
 cout << num << endl;
}

Console* console = new Console();

void
CppPrintDouble(double num) {
 console->PrintDouble(num);
}

最終調用如下。

/**
 * call.c
 */
#include "called.h"

int
main(int argc, char const* argv[]) {
 CppPrintDouble(3.14);
 return 0;
}

五、C++ 函數調用 C 接口

被調用函數的聲明和定義如下。

/**
 * called.h
 */
#ifndef CALLED_H
#define CALLED_H

void PrintC(void);

#endif
/**
 * called.c
 */
#include 

#ifdef __cplusplus
extern "C" {
#endif
#include "called.h"
#ifdef __cplusplus
};
#endif

void
PrintC(void) {
 printf("I\'m C.\n");
}

最終調用如下。

/**
 * call.cpp
 */
#ifdef __cplusplus
extern "C" {
#endif
#include "called.h"
#ifdef __cplusplus
};
#endif

int
main(int argc, char const* argv[]) {
 PrintC();
 return 0;
}

在 called.c 文件中,#ifdef __cplusplus /*...*/ #endif 和 extern "C" 的作用是防止 g++ 編譯器對“.c”文件用 C++ 的方式編譯,如果用 gcc 進行編譯,則直接寫 #include "called.h" 就行。

到此這篇關于C 與 C++ 接口函數相互調用的實現的文章就介紹到這了,更多相關C 與 C++ 接口函數調用內容請搜索創新互聯以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持創新互聯!


名稱欄目:C與C++接口函數相互調用的實現
網頁路徑:http://www.xueling.net.cn/article/gdhioe.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 国产久一| 亚洲一区二区三区国产精品 | 555www色欧美视频 | 欧美成人午夜不卡免费 | 国产成人精品无码A区在线观看 | 色屁屁WWW影院免费观看入口 | 人人干人人草 | 日韩成人av影院 | 中文字幕人妻三级中文无码视频 | 又大又硬又爽免费视频 | 久色porn | 91五月色国产在线观看 | 日韩精品无码人成视频手机 | 成人亚洲免费视频 | 久久久久久性高 | 91在线视频| 99热这里只有精品国产免费免费 | 亚洲日韩精品欧美一区二区 | 忘忧草在线影院www日本 | 久久精品麻豆日日躁夜夜躁 | 午夜资源 | 韩国a级黄色 | 公车上玩弄白嫩少妇 | 午夜看片在线观看 | 亚洲AV无码一区二区三区鸳鸯影院 | 黄频在线观看国产免费 | 91黄视频在线观看 | 公天天吃我奶躁我的比视频 | 新婚人妻扶着粗大强行坐下 | 亚洲网站在线 | 国产成人AV片在线观看 | 欧美一级淫片免费视频欧美辣图 | 国产精品国产一区 | 亚洲一区二区三区四区视频 | 日本午夜人人精品 | 视频国产激情 | 九九天堂网 | 国产有码在线观看 | 99九九99九九九99九他书对 | 二区三区在线观看 | 国产精品久久久久久久久鸭无码 |