中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么調用已經寫好的C接口

發布時間:2021-10-15 10:22:52 來源:億速云 閱讀:162 作者:小新 欄目:開發技術

這篇文章主要介紹了C++怎么調用已經寫好的C接口,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1、C++調用C文件

一個C語言文件test.c

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

一個頭文件test.h

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

C++文件調用C函數

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

執行命令

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

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

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

2、原因分析

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

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

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

$ 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),這個時候是可以找到的,是不會報錯的。

總結:

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

3、解決調用失敗問題

修改test.h文件

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

修改后再次執行命令

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

運行無報錯

4、思考:那C語言能夠調用C接口嗎

實驗:定義main.c函數如下

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

重新執行命令如下

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

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

5、C接口既能被C++調用又能被C調用

為了使得test.c代碼既能被C++調用又能被C調用

將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的插件,快速生成上面的代碼

再次執行命令

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

結果示意:

C++怎么調用已經寫好的C接口

感謝你能夠認真閱讀完這篇文章,希望小編分享的“C++怎么調用已經寫好的C接口”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

泸西县| 中宁县| 湘潭县| 渭南市| 水城县| 章丘市| 江都市| 五大连池市| 常熟市| 松江区| 保山市| 乌恰县| 登封市| 青铜峡市| 兰溪市| 临夏市| 南陵县| 项城市| 永宁县| 江阴市| 新安县| 镇雄县| 芒康县| 久治县| 旬邑县| 琼结县| 长寿区| 万州区| 建阳市| 绥中县| 中西区| 会同县| 扎赉特旗| 阿克苏市| 泸定县| 伊金霍洛旗| 井陉县| 北海市| 东宁县| 丽江市| 千阳县|