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

C++如何調(diào)用已經(jīng)寫好的C接口

 更新時間:2021年10月14日 15:57:51   作者:deroy  
如何在C++代碼中調(diào)用寫好的C接口?你可能會奇怪,C++不是兼容C嗎?直接調(diào)用不就可以了,那么我們來測試一下,先看看C++如何調(diào)用C代碼接口的,需要的朋友可以參考一下

前言:

如何在C++代碼中調(diào)用寫好的C接口?你可能會奇怪,C++不是兼容C嗎?直接調(diào)用不就可以了,那么我們來測試一下,先看看C++如何調(diào)用C代碼接口的。

1、C++調(diào)用C文件

一個C語言文件test.c

#include <stdio.h> 
void print(int a,int b) 
{ 
    printf("這里調(diào)用的是C語言的函數(shù):%d,%d\n",a,b); 
} 


一個頭文件test.h

#ifndef _TEST_H 
#define _TEST_H 
 
void print(int a,int b); 
 
#endif 


C++文件調(diào)用C函數(shù)

#include <iostream> 
using namespace std; 
#include "test.h" 
int main() 
{ 
   cout<<"現(xiàn)在調(diào)用C語言函數(shù)\n"; 
   print(3,4); 
   return 0; 
} 

執(zhí)行命令

gcc -c test.c 
g++ -o main main.cpp test.o 

編譯后鏈接出錯:main.cppprint(int, int)未定義的引用。

那么g++編譯器為什么找不到print(int,int)呢,其實在我們學(xué)C++重載的時候就提到過C++底層的編譯原理。

2、原因分析

test.c我們使用的是C語言的編譯器gcc進行編譯的,其中的函數(shù)print編譯之后,在符號表中的名字為 print,通過nm查看.o文件.

$ gcc -c test.c 
$ nm test.o  
                 U _GLOBAL_OFFSET_TABLE_ 
0000000000000000 T print 
                 U printf 


我們鏈接的時候采用的是 g++ 進行鏈接,也就是 C++ 鏈接方式,程序在運行到調(diào)用 print 函數(shù)的代碼時,會在符號表中尋找 _Z5printii(是按照C++的鏈接方法來尋找的,所以是找 _Z5printii 而不是找 print)的名字,發(fā)現(xiàn)找不到,所以會提示“未定義的引用”

$ g++ -c test.c 
$ ls 
main.cpp  makefile  test.c  test.h  test.o 
$ nm test.o 
                 U _GLOBAL_OFFSET_TABLE_ 
                 U printf 
0000000000000000 T _Z5printii 


此時如果我們在對print的聲明中加入 extern “C” ,這個時候,g++編譯器就會按照C語言的鏈接方式進行尋找,也就是在符號表中尋找print(這才是C++兼容C),這個時候是可以找到的,是不會報錯的。

總結(jié):

編譯后底層解析的符號不同,C語言是 _print,C++ __Z5printii

3、解決調(diào)用失敗問題

修改test.h文件

#ifndef _TEST_H 
#define _TEST_H 
extern "C"{ 
void print(int a,int b); 
} 
#endif 


修改后再次執(zhí)行命令

gcc -c test.c 
g++ -o main main.cpp test.o 
./main 


運行無報錯

4、思考:那C語言能夠調(diào)用C接口嗎

實驗:定義main.c函數(shù)如下

#include <stdio.h> 
#include "test.h" 
int main() 
{ 
    printf("現(xiàn)在調(diào)用C語言函數(shù)\n"); 
    print(3,4); 
    return 0; 
} 

重新執(zhí)行命令如下

gcc -c test.c 
gcc -o mian main.c test.o 


報錯:C語言里面沒有extern “C“這種寫法

5、C接口既能被C++調(diào)用又能被C調(diào)用

為了使得test.c代碼既能被C++調(diào)用又能被C調(diào)用

將test.h修改如下

#ifndef __TEST_H__ 
#define __TEST_H__ 
 
#ifdef __cplusplus 
#if __cplusplus 
extern "C"{ 
#endif 
#endif /* __cplusplus */ 
 
extern void print(int a,int b); 
 
#ifdef __cplusplus 
#if __cplusplus 
} 
#endif 
#endif /* __cplusplus */ 
#endif /* __TEST_H__ */ 


ps:下期介紹一個Source Insight的插件,快速生成上面的代碼

再次執(zhí)行命令

gcc -c test.c 
gcc -o main main.c test.o 
./main 


結(jié)果示意:

到此這篇關(guān)于C++如何調(diào)用已經(jīng)寫好的C接口的文章就介紹到這了,更多相關(guān)C++如何調(diào)用C接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • 教你分辨C++堆與棧的區(qū)別

    教你分辨C++堆與棧的區(qū)別

    堆與棧的區(qū)別有:1、棧由系統(tǒng)自動分配,而堆是人為申請開辟;2、棧獲得的空間較小,而堆獲得的空間較大;3、棧由系統(tǒng)自動分配,速度較快,而堆一般速度比較慢;4、棧是連續(xù)的空間,而堆是不連續(xù)的空間
    2021-06-06
  • C語言入門篇--函數(shù)及數(shù)組用法

    C語言入門篇--函數(shù)及數(shù)組用法

    本篇文章是c語言基礎(chǔ)篇,主要為大家介紹了C語言的函數(shù)與數(shù)組,每個函數(shù)本質(zhì)上都實現(xiàn)一個最小的功能,而main函數(shù)只負責(zé)調(diào)用函數(shù),實現(xiàn)代碼的核心邏輯,提高代碼的可維護性
    2021-08-08
  • Opencv學(xué)習(xí)教程之漫水填充算法實例詳解

    Opencv學(xué)習(xí)教程之漫水填充算法實例詳解

    這篇文章主要給大家介紹了Opencv學(xué)習(xí)教程之漫水填充算法的相關(guān)資料,文中給出了詳細的示例代碼供大家參考學(xué)習(xí),對大家具有一定的參考價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng)課程設(shè)計

    C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng)課程設(shè)計

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Qt中QStringList與QString的常用方法總結(jié)

    Qt中QStringList與QString的常用方法總結(jié)

    這篇文章主要為大家總結(jié)了Qt中QString 與 (QStringList | QByteArray)之間的轉(zhuǎn)換,以及QString、QStringList的一些常用方法,感興趣的可以收藏一下
    2022-12-12
  • C語言斷言函數(shù)assert()的學(xué)習(xí)筆記

    C語言斷言函數(shù)assert()的學(xué)習(xí)筆記

    在C語言庫函數(shù)中提供了一個輔助調(diào)試程序的小型庫,它是由assert()宏組成,本文就詳細的介紹了一下如何使用,感興趣的可以了解一下
    2021-11-11
  • C語言算法金手指摩爾投票法手撕絕大多數(shù)問題

    C語言算法金手指摩爾投票法手撕絕大多數(shù)問題

    這篇文章主要為大家介紹了C語言算法之金手指摩爾投票法手撕絕大多數(shù)問題的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • C語言實現(xiàn)飛機游戲(豪華版)的示例代碼

    C語言實現(xiàn)飛機游戲(豪華版)的示例代碼

    在前文中已經(jīng)實現(xiàn)了基礎(chǔ)版和進階版的飛機游戲,但是存在的問題很明顯:已經(jīng)發(fā)射出去的子彈會隨著飛機位置的實時改變而改變,并且不能實現(xiàn)連發(fā)。本篇文章將利用數(shù)組進一步改進空戰(zhàn)游戲,感興趣的可以了解一下
    2022-10-10
  • C/C++實操True and false詳解

    C/C++實操True and false詳解

    這篇文章主要給大家介紹了關(guān)于Python中常用的數(shù)據(jù)類型bool(布爾)類型的兩個值:True和False的相關(guān)資料,通過示例代碼給大家進行了解惑,讓對這兩個值有所疑惑的朋友們能有起到一定的幫助,需要的朋友下面來一起看看吧。
    2021-09-09
  • 淺析C語言中的內(nèi)存布局

    淺析C語言中的內(nèi)存布局

    以下是對C語言中的內(nèi)存布局進行了詳細的分析介紹。需要的朋友可以過來參考下
    2013-08-08

最新評論

钟祥市| 铁岭市| 麟游县| 浏阳市| 西华县| 鲁山县| 修水县| 彰武县| 浦东新区| 竹北市| 丹凤县| 横峰县| 湘潭市| 玉田县| 青州市| 泽州县| 江达县| 右玉县| 长白| 安义县| 临武县| 时尚| 新乡县| 滨州市| 长岭县| 大悟县| 额敏县| 家居| 太仆寺旗| 奈曼旗| 寿光市| 沂水县| 韶山市| 曲沃县| 嘉兴市| 丰镇市| 洪江市| 商洛市| 泰宁县| 星座| 阜康市|