我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++如何调用已经写好的C接口

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++如何调用已经写好的C接口

前言:

如何在C++代码中调用写好的C接口?你可能会奇怪,C++不是兼容C吗?直接调用不就可以了,那么我们来测试一下,先看看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  
 
extern void print(int a,int b); 
 
#ifdef __cplusplus 
#if __cplusplus 
} 
#endif 
#endif  
#endif  


ps:下期介绍一个Source Insight的插件,快速生成上面的代码

再次执行命令


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


结果示意:

到此这篇关于C++如何调用已经写好的C接口的文章就介绍到这了,更多相关C++如何调用C接口内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++如何调用已经写好的C接口

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#如何实现接口base调用

今天小编给大家分享一下C#如何实现接口base调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。背景在三年前发布的C#8.0
2023-07-02

C#开发经验分享:设计良好的API与接口

C#开发经验分享:设计良好的API与接口引言:随着软件开发技术的进步和发展,API(Application Programming Interface)和接口(Interface)的设计在软件开发中起到了至关重要的作用。一个好的API和接口
C#开发经验分享:设计良好的API与接口
2023-11-22

c#如何调用c++的DLL

这篇文章主要讲解了“c#如何调用c++的DLL”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c#如何调用c++的DLL”吧!C#是托管型代码,创建的对象会自动回收。C++是非托管型代码,创建
2023-06-30

C#调用接口的方式有哪些

这篇“C#调用接口的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#调用接口的方式有哪些”文章吧。在用C#调用接
2023-07-02

php中如何写接口给别人调用

在PHP中,可以使用以下几种方式来编写接口给别人调用:1. 使用函数:可以将需要对外提供的功能封装为一个函数,然后通过调用函数来实现。例如:```phpfunction add($a, $b) {return $a + $b;}$resul
2023-08-08

java调用c语言接口的方法是什么

Java调用C语言接口的方法主要有以下几种:1. 使用Java Native Interface(JNI):JNI是Java提供的一种机制,允许Java应用程序调用本地(即C或C++)代码。通过JNI,可以在Java中声明本地方法,并使用N
2023-08-08

Visual Studio 2010如何调用非C#编写的DLL文件

这篇文章主要介绍“Visual Studio 2010如何调用非C#编写的DLL文件”,在日常操作中,相信很多人在Visual Studio 2010如何调用非C#编写的DLL文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
2023-06-17

如何调用作为参数接收的 C 函数

编程网今天将给大家带来《如何调用作为参数接收的 C 函数》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!问题内容我想使
如何调用作为参数接收的 C 函数
2024-04-04

python如何直接调用和使用swig法方调用c++库

小编给大家分享一下python如何直接调用和使用swig法方调用c++库,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!c++运算速度快于python,python简单易写。很多时候对于已有的c++代码也不想用python重
2023-06-29

C#中的方法如何调用

这篇文章主要介绍了C#中的方法如何调用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中的方法如何调用文章都会有所收获,下面我们一起来看看吧。可以使用类的实例从另一个类中调用其他类的公有方法。例如,方法 Fi
2023-06-17

c#如何调用API中的copymemory()函数

在C#中调用API中的CopyMemory()函数,可以使用DllImport特性来声明API函数,并使用Marshal类中的相关方法来处理内存复制操作。以下是一个示例代码:using System;using System.Runt
c#如何调用API中的copymemory()函数
2024-02-29

C++如何调用简单的python程序

这篇文章主要介绍了C++如何调用简单的python程序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录