IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++】C程序和C++程序之间的互相调用 -> 正文阅读

[C++知识库]【C++】C程序和C++程序之间的互相调用


前言

我们都知道C和C++是两种语言,C++兼容C。但是有时候我们用C++写了一个程序,想使用C文件里的函数。或者我们用C语言写了一个程序,想调用C++程序里的函数。会发现两者不能互相调用,其实是可以的,这篇文章将会为你揭晓。


一、C++调用C

首先,我们先我们要有2个项目,一个项目以C++程序编译,要调用的项目则是以C程序编译的。


C++项目:
在这里插入图片描述


C程序项目:

需要头文件,头文件是提供给主程序包含的。
在这里插入图片描述


因为是C++调用C,而一个程序只有一个main函数,所以C项目里是没有main函数的。

生成静态库

然后,我们需要把C项目生成静态库。
在这里插入图片描述
在这里插入图片描述

点击确定,然后编译。
在这里插入图片描述

在这里插入图片描述
这个lib文件就是Print项目的静态库

包含头文件

然后我们把生成的.lib文件和C程序的.h文件移到 C++程序下。
在这里插入图片描述
然后包含头文件
在这里插入图片描述

添加依赖库

在这里插入图片描述
把C程序生成的 .lib静态库添加进去
在这里插入图片描述
在这里插入图片描述

extern

然后我们需要用extern 来修饰这个头文件。


extern "C" //用C语言的方式编译括号内容
{
#include "Print.h"
}

int main()
{
	Print();
	return  0;
}

然后我们运行程序
在这里插入图片描述

这样,就成功的使用 CPP程序调用C程序的内容了

二、C调用C++

C调用和C++ , 和C++调用C,其实差不多。

我们把要调用的程序 改成C++程序
在这里插入图片描述
然后把主程序改成C程序
在这里插入图片描述
但此时问题了,C 语言里 没有 extern "C"这个用法,这种用法放在C程序里会出错,所以我们把它删掉。

#define _CRT_SECURE_NO_WARNINGS 1


#include "Print.h"

int main()
{
	Print();
	return  0;
}

然后 打印的内容改成 is C++
在这里插入图片描述

因为CPP程序和C语言程序对函数名的修饰不同,所以我们要用extern 来修饰C++程序里需要调用的函数,
在这里插入图片描述但此时问题又来了,.h的头文件会在预处理的时候展开,但是C语言不认识 extern “C”,所以我们可以这样。

#pragma once


#ifdef __cplusplus
extern "C"
{
#endif

void Print();

#ifdef __cplusplus
}
#endif

__cplusplus 是一个宏定义,只要在以C++程序编译时,才会有。如果不是以C++程序编译,那么就不会 展开 extern “C”。

然后我们就可以编译了,生成的是C++程序的静态库
在这里插入图片描述

再把C++的静态库和Print.h 文件 移动到C程序目录
在这里插入图片描述

主程序里也别忘了添加依赖库
在这里插入图片描述
在这里插入图片描述

这样我们就成功用 C程序调用了C++程序里的函数
在这里插入图片描述

总结

无论是C++调用C里面的函数,还是C调用C++里的函数。本质都是一样的,唯一需要注意的是 C语言里面 没有 extern “C” 这种用法。所以C++程序里需要保证,在以C++编译时,变换成以C的方式编译,也就是使用extern “C”。但同时,还需要避免当 .h文件在C文件中展开时, extern “C” 带来的错误。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 10:47:31  更:2022-12-25 10:47:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 2:49:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码