C++調(diào)用C接口的實(shí)現(xiàn)示例
C++調(diào)用C代碼
一個(gè)C語(yǔ)言文件p.c
#include <stdio.h>
void print(int a,int b)
{
printf("這里調(diào)用的是C語(yǔ)言的函數(shù):%d,%d\n",a,b);
}
一個(gè)頭文件p.h
#ifndef _P_H #define _P_H void print(int a,int b); #endif
C++文件調(diào)用C函數(shù)
#include <iostream>
using namespace std;
#include "p.h"
int main()
{
cout<<"現(xiàn)在調(diào)用C語(yǔ)言函數(shù)\n";
print(3,4);
return 0;
}
執(zhí)行命令
gcc -c p.c g++ -o main main.cpp p.o
編譯后鏈接出錯(cuò):main.cpp對(duì)print(int, int)未定義的引用。
原因分析
- p.c我們使用的是C語(yǔ)言的編譯器gcc進(jìn)行編譯的,其中的函數(shù)print 編譯之后,在符號(hào)表中的名字為 _print
- 我們鏈接的時(shí)候采用的是g++進(jìn)行鏈接,也就是C++鏈接方式,程序在運(yùn)行到調(diào)用 print函數(shù)的代碼時(shí),會(huì)在符號(hào)表中尋找_print_int_int(是按照C ++的鏈接方法來(lái)尋找的,所以是找_print_int_int而不是找_print )的名字,發(fā)現(xiàn)找不到,所以會(huì)t提示“未定義的引用”
- 此時(shí)如果我們?cè)趯?duì)print的聲明中加入 extern “C” ,這個(gè)時(shí)候,g ++編譯器就會(huì)按照C語(yǔ)言的鏈接方式進(jìn)行尋找,也就是在符號(hào)表中尋找_print ,這個(gè)時(shí)候是可以找到的,是不會(huì)報(bào)錯(cuò)的。
總結(jié)
編譯后底層解析的符號(hào)不同,C語(yǔ)言是_print,C++是_print_int_int
解決調(diào)用失敗問(wèn)題
修改p.h文件
#ifndef _P_H
#define _P_H
extern "C"{
void print(int a,int b);
}
#endif
修改后再次執(zhí)行命令
gcc -c p.c g++ -o main main.cpp p.o ./main
運(yùn)行無(wú)報(bào)錯(cuò)
思考:那C代碼能夠被C程序調(diào)用嗎
實(shí)驗(yàn):定義main,c函數(shù)如下
#include <stdio.h>
#include "p.h"
int main()
{
printf("現(xiàn)在調(diào)用C語(yǔ)言函數(shù)\n");
print(3,4);
return 0;
}
重新執(zhí)行命令如下
gcc -c p.c gcc -o mian main.c p.o
報(bào)錯(cuò):C語(yǔ)言里面沒(méi)有extern “C“這種寫(xiě)法
C代碼既能被C++調(diào)用又能被C調(diào)用
為了使得p.c代碼既能被C++調(diào)用又能被C調(diào)用
將p.h修改如下
#ifndef _P_H
#define _P_H
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
void print(int a,int b);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* __P_H */
再次執(zhí)行命令
gcc -c p.c gcc -o mian main.c p.o ./mian
結(jié)果示意:

到此這篇關(guān)于C++調(diào)用C接口的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C++調(diào)用C接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++數(shù)據(jù)結(jié)構(gòu)之鏈表詳解
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之鏈表的創(chuàng)建的相關(guān)資料,希望通過(guò)本文幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2021-08-08
C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理系統(tǒng)(文件數(shù)據(jù)庫(kù))
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Linux C/C++實(shí)現(xiàn)DNS客戶(hù)端請(qǐng)求域名IP的示例代碼
DNS全稱(chēng):Domain Name System,域名解析系統(tǒng),是互聯(lián)網(wǎng)的一項(xiàng)服務(wù),本文主要介紹了C/C++如何實(shí)現(xiàn)DNS客戶(hù)端請(qǐng)求域名IP,感興趣的可以了解下2024-03-03
OpenCV圖像旋轉(zhuǎn)Rotate的詳細(xì)介紹
這篇文章主要介紹了OpenCV圖像旋轉(zhuǎn)Rotate,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
windows上安裝CLion教程及簡(jiǎn)單使用詳解
這篇文章主要介紹了windows上安裝CLion教程及簡(jiǎn)單使用,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08

