最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C 與 C++ 接口函數(shù)相互調(diào)用的實(shí)現(xiàn)

 更新時(shí)間:2020年03月22日 15:34:27   作者:云亭  
這篇文章主要介紹了C 與 C++ 接口函數(shù)相互調(diào)用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、C 或 C++ 編譯的四個(gè)步驟

(一) 預(yù)處理

在該步驟中,編譯器將源程序中以“#”開頭的語句進(jìn)行處理。其中,#include 的原理是將目標(biāo)文件內(nèi)容導(dǎo)入本文件。

(二) 編譯

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

(三) 匯編

在該步驟中,編譯器將第二步生成的各個(gè)文件分別轉(zhuǎn)換為二進(jìn)制文件,但還不是可執(zhí)行文件。

(四) 鏈接

在該步驟中,編譯器會(huì)為第三步生成的每一個(gè)文件“穿針引線”,比如 main() 函數(shù)中調(diào)用了 Print() 函數(shù),還不知道 Print() 函數(shù)在哪里,而在 Print() 函數(shù)主體所在的那個(gè)文件中,已經(jīng)標(biāo)明了 Print() 函數(shù)的地址,所以編譯器會(huì)在 main() 函數(shù)中調(diào)用 Print() 函數(shù)的地方標(biāo)注 Print() 函數(shù)的地址,為程序執(zhí)行過程中的地址跳轉(zhuǎn)提供目標(biāo)地址,而編譯器能做到這一步的前提,是 main() 函數(shù)中 Print() 函數(shù)的標(biāo)識(shí),和 Print() 函數(shù)主體所在的那個(gè)文件中 Print() 函數(shù)的標(biāo)識(shí)是一模一樣的,如果不一樣,就會(huì)觸發(fā)鏈接錯(cuò)誤。

二、C 與 C++ 接口相互調(diào)用的關(guān)鍵

從上文可以得知,要調(diào)用一個(gè)函數(shù)有一個(gè)重要條件就是調(diào)用處的符號(hào)和函數(shù)主體處的符號(hào)要一模一樣,而 C 和 C++ 在編譯過程中將函數(shù)名稱改編成標(biāo)識(shí)符號(hào)的方法是不一樣的,因此相互調(diào)用的關(guān)鍵在于統(tǒng)一接口函數(shù)的標(biāo)識(shí)符號(hào),而一般采取的方法是,用 C 函數(shù)改編的方法統(tǒng)一接口函數(shù)的改編方式。

三、extern "C"

extern "C" 的作用是告訴編譯器按 C 函數(shù)名稱改編的方法將修飾的函數(shù)改編成標(biāo)識(shí)符號(hào)。extern "C" 一般用在 C++ 文件中。

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

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

四、C 函數(shù)調(diào)用 C++ 接口

(一) 調(diào)用非成員函數(shù)

被調(diào)用函數(shù)的聲明和定義如下。

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

extern "C" void PrintCpp(void);

#endif

/**
 * called.cpp
 */
#include <iostream>
#include "called.h"

using namespace std;

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

最終調(diào)用如下。

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

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

(二) 調(diào)用類成員函數(shù)(接口函數(shù)沒有類指針)

被調(diào)用函數(shù)聲明和定義如下。

/**
 * 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 <iostream>
#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);
}

最終調(diào)用如下。

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

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

五、C++ 函數(shù)調(diào)用 C 接口

被調(diào)用函數(shù)的聲明和定義如下。

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

void PrintC(void);

#endif
/**
 * called.c
 */
#include <stdio.h>

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

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

最終調(diào)用如下。

/**
 * 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++ 編譯器對(duì)“.c”文件用 C++ 的方式編譯,如果用 gcc 進(jìn)行編譯,則直接寫 #include "called.h" 就行。

到此這篇關(guān)于C 與 C++ 接口函數(shù)相互調(diào)用的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C 與 C++ 接口函數(shù)調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt/C++編寫視頻監(jiān)控系統(tǒng)之自定義音柱顯示功能

    Qt/C++編寫視頻監(jiān)控系統(tǒng)之自定義音柱顯示功能

    通過音柱控件實(shí)時(shí)展示當(dāng)前播放的聲音產(chǎn)生的振幅的大小,得益于音頻播放組件內(nèi)置了音頻振幅的計(jì)算,可以動(dòng)態(tài)開啟和關(guān)閉,開啟后會(huì)對(duì)發(fā)送過來的要播放的聲音數(shù)據(jù),這篇文章主要介紹了Qt/C++編寫視頻監(jiān)控系統(tǒng)之自定義音柱顯示功能,需要的朋友可以參考下
    2024-01-01
  • 如何基于C++解決RTSP取流報(bào)錯(cuò)問題

    如何基于C++解決RTSP取流報(bào)錯(cuò)問題

    這篇文章主要介紹了如何基于C++解決RTSP取流報(bào)錯(cuò)問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Win10+VS2017新CUDA項(xiàng)目配置教程

    Win10+VS2017新CUDA項(xiàng)目配置教程

    這篇文章主要為大家詳細(xì)介紹了Win10+VS2017新CUDA項(xiàng)目配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C++自動(dòng)析構(gòu)時(shí)的順序問題

    C++自動(dòng)析構(gòu)時(shí)的順序問題

    這篇文章主要介紹了C++自動(dòng)析構(gòu)時(shí)的順序,通過實(shí)例代碼給大家講解了C++ 構(gòu)造與析構(gòu)的執(zhí)行順序,代碼簡(jiǎn)單易懂,非常不錯(cuò)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C/C++?Qt?運(yùn)用JSON解析庫的實(shí)例代碼

    C/C++?Qt?運(yùn)用JSON解析庫的實(shí)例代碼

    這篇文章主要介紹了C/C++?Qt?運(yùn)用JSON解析庫的相關(guān)知識(shí),通過代碼依次解析這個(gè)json文件中的每一個(gè)參數(shù),代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • C語言實(shí)現(xiàn)打印星號(hào)圖案

    C語言實(shí)現(xiàn)打印星號(hào)圖案

    這篇文章主要介紹了C語言實(shí)現(xiàn)打印星號(hào)圖案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++ OpenCV繪制簡(jiǎn)易直方圖DrawHistImg

    C++ OpenCV繪制簡(jiǎn)易直方圖DrawHistImg

    本文主要介紹了一個(gè)能繪制簡(jiǎn)易直方圖的簡(jiǎn)單函數(shù)DrawHistImg,可以幫助大家快速掌握繪制的原理,可以根據(jù)自己的創(chuàng)意對(duì)其進(jìn)行改善和補(bǔ)充。需要的朋友可以參考一下
    2021-12-12
  • 求解旋轉(zhuǎn)數(shù)組的最小數(shù)字

    求解旋轉(zhuǎn)數(shù)組的最小數(shù)字

    這篇文章主要介紹了求解旋轉(zhuǎn)數(shù)組的最小數(shù)字的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++簡(jiǎn)單實(shí)現(xiàn)Dijkstra算法

    C++簡(jiǎn)單實(shí)現(xiàn)Dijkstra算法

    這篇文章主要為大家詳細(xì)介紹了C++簡(jiǎn)單實(shí)現(xiàn)Dijkstra算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++中聲明、定義、初始化、賦值區(qū)別介紹

    C++中聲明、定義、初始化、賦值區(qū)別介紹

    在?C++?中,聲明、定義、初始化、賦值是變量的四個(gè)基本操作,很多朋友不清楚他們之間有什么區(qū)別,今天通過本文給大家介紹下C++中聲明、定義、初始化、賦值區(qū)別,感興趣的朋友一起看看吧
    2023-05-05

最新評(píng)論

开封县| 抚州市| 尚义县| 仁寿县| 榆林市| 凌云县| 孟州市| 鄯善县| 灵山县| 保亭| 图木舒克市| 桓仁| 平顶山市| 大港区| 祁门县| 张掖市| 顺昌县| 揭西县| 堆龙德庆县| 堆龙德庆县| 平顺县| 桂平市| 吴川市| 大余县| 凌源市| 宕昌县| 中宁县| 贡嘎县| 永顺县| 石家庄市| 淮安市| 台北县| 鹿邑县| 永康市| 榆林市| 精河县| 日照市| 岳普湖县| 泸定县| 西青区| 兰考县|