C与C++源文件的拼接

2023-05-16

C++与C处理函数名

如果C++两个cpp源文件中函数名称相同,会出现如下错误(ave就是函数名)

"int __cdecl ave(void)" (?ave@@YAHXZ) 已经在 e.obj 中定义 

如果两个C源文件函数名相同,就会出现如下错误

  _ave 已经在 e.obj 中定义     

但是,如果一个C源文件和CPP源文件函数名相同,它却不会发生错误

说明了在C源文件中,ave被处理成了_ave,而在CPP源文件中,被处理成了?ave@@YAHX,因为C++中为了标记重载函数,不仅重命名了ave,还给了参数不同的形式,YAHXJ就是不同的参数形式,而C不支持函数重载,所以把ave定义成了_ave就行了。

所以我们可以得出,如果一个CPP源文件要调用C文件中 的某个函数,那肯定是行不通的,毕竟处理后的名字都不相同了,编译器去找这个函数名,找的是ave@@YAHX,却只有_ave,肯定找不到,那么如何才能调用C风格的函数呢,就要用到关键字extern

extern “C”

语法:extern "c" 返回值类型 函数名()

告诉编译器这是一个C风格的函数,如果C++调用C里面的函数,编译器就会去找C风格处理后的函数,即_ave(),这样就能在C源文件里找到。我在这里卡了很久,代码没错,却总是报错,显示未找到该函数,很久以后,把电脑重启后,才编译成功,也许是VS的bug吧。另外为了保险起见,也可以函数声明和函数定义两部分都加上extern C。

#ifdef __cplusplus

我们学习了如何在C++中调用C文件,那如何从C文件中调用C++函数呢?一种方法是在C++源文件中告诉编译器这是个C风格的函数,如果不在源文件告诉,在头文件告诉的话,如果C文件又要调用这个头文件,就会报错,因为C语言没有这种写法,所以我们用另一种方法,就要用到下面的代码

在头文件前加入

#ifdef __cplusplus
    extern "C"
#endif

这段代码意思就是如果是C++文件,就转换成C风格,如果不是C++文件,就不出现extern "c",这样如果C文件再调用这个头文件,就不会出错。

LINK4042

如果源文件下面有math.c和math.cpp,编译后就会报错,虽然是两个不同的源文件,但编译后都是math.obj,就会重名,会报错,解决办法就是另外取一个名字

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C与C++源文件的拼接 的相关文章

随机推荐

  • 一、Redis入门概述(是什么,能干嘛,去哪下,怎么玩)

    一 redis是什么 xff1f Redis REmote Dictionary Server 远程字典服务器 官方解释 xff1a Remote Dictionary Server 远程字典服务 是完全开源的 xff0c 使用ANSIC语
  • 二、Redis安装配置(云服务器、vmware本地虚拟机)

    一 自己购买服务器 自己购买阿里云 青牛云 腾讯云或华为云服务器 xff0c 自带CentoOS或者Ubuntu环境 xff0c 直接开干 二 Vmware本地虚拟机安装 1 VMWare虚拟机的安装 xff0c 不讲解 xff0c 默认懂
  • 【MySQL基础】数据类型

    文章目录 整数类型浮点类型定点数类型日期和时间类型字符串类型文本类型二进制字符串类型JSON 类型位类型ENUM类型SET类型空间类型 整数类型 整数类型一共有 5 种 xff0c 包括 TINYINT SMALLINT MEDIUMINT
  • ubuntu16.04备份和迁移

    ubuntu16 04备份和迁移 背景实践1 备份整个系统2 重装Ubuntu16 043 恢复系统 题外话 xff1a 修改主机名参考文章 背景 此文用来快速记录备份和恢复的过程步骤 xff0c 具体命令意思不做过多介绍 因为不想新设备重
  • c++20协程基础概念

    c 43 43 协程介绍 前言 官方文档地址 本文主要对c 43 43 reference做翻译 不会逐字翻译 xff0c 同时对其中的概念以及协程运行过程做对应的解释 因为是学习过程中的记录 xff0c 如有问题 xff0c 希望大家能够
  • Flask 与 Django 框架对比

    详细分析了两种 Python Web框架 xff1a Flask 与 Django 从开发难易度 应用架构 性能 可扩展性以及适用范围等方面进行了详细说明 Django 中级教程在 B 站上线 xff0c 深入解析 Django 体系架构
  • STM32F103C8T6基础开发教程(HAL库)—点亮第一颗LED灯

    STM32F103C8T6基础开发教程目录 STM32F103C8T6基础开发教程 xff08 HAL库 xff09 开发环境配置STM32F103C8T6基础开发教程 xff08 HAL库 xff09 Keil添加注释的快捷键STM32F
  • C++实现插入排序算法(直接插入排序、折半插入排序、希尔排序)

    排序算法分为五大类 xff0c 一共是有九种 xff0c 如下 xff1a 插入类 xff1a 直接插入排序 折半插入排序 希尔排序 交换类 xff1a 冒泡排序 快速排序 选择类 xff1a 简单选择排序 堆排序 归并类 xff1a 二路
  • C++实现二路归并排序算法

    排序算法分为五大类 xff0c 一共是有九种 xff0c 如下 xff1a 插入类 xff1a 直接插入排序 折半插入排序 希尔排序 交换类 xff1a 冒泡排序 快速排序 选择类 xff1a 简单选择排序 堆排序 归并类 xff1a 二路
  • C语言实现-学生信息管理系统

    通过C语言实现一个学生信息管理系统 xff0c 要求如下 xff1a xff08 1 xff09 用户采用自己账号和密码登录系统 xff1b xff08 2 xff09 学生信息和账号密码通过文件的形式存储 xff1b xff08 3 xf
  • 通过python画矢量图(matplotlib,有代码)

    python画矢量图 xff08 有代码 xff09 python的matplotlib可以保存的文件格式word可以插入哪些图片格式呢代码中文乱码问题 有些同学因为文章的要求 xff0c 图片插入到word里的时候需要足够清晰 xff0c
  • Java实现LRU

    首先看看什么是LRU LRU是Least Recently Used的缩写 xff0c 即最近最少使用 xff0c 是一种常用的页面置换算法 xff0c 选择最近最久未使用的页面予以淘汰 该算法赋予每个页面一个访问字段 xff0c 用来记录
  • 域名cdn加速(apache与nginx)

    一 xff1a 由于公司业务属于请求量比较大的吧 xff0c 每个月几亿条 xff0c 考虑到安全性 xff0c 所以需要域名由http改为https cdn加速才可以支成撑业务 二 xff1a 之前的系统是使用lamp配置的 xff0c
  • ubuntu系统安装完nvidia显卡驱动后黑屏,不能进入系统

    我之前安装了系统里建议安装的nvidia 380显卡驱动 xff0c 为了安装更高版本的CUDA xff0c 我将nvidia显卡驱动升级到了430 xff0c 但是重启电脑进入Ubuntu系统时黑屏 xff0c 进不去系统界面 xff0c
  • 黑盒模糊测试之AFL++

    git clone depth 1 https github com AFLplusplus AFLplusplus cd AFLplusplus make Build Summary 43 afl fuzz and supporting
  • centos7安装MySQL5.7

    一 下载mysql5 7 1 下载地址 mysql 5 7 28 1 el7 x86 64 rpm bundle tar 2 上传至服务器 3 解压压缩包 解压命令 tar xvf mysql 5 7 28 1 el7 x86 64 rpm
  • 打包VSCode源码为安装程序(.exe)

    参考博客 GitHub vscode里的Packaging部分 xff1a https github com microsoft vscode wiki How to Contribute 这里提供了vscode打包后可以发布的平台代码 x
  • Ubuntu的安装卡在安装界面 (解决方法记录)

    安装过程 在 Install Ubuntu 的grub 选项上点击e 在 Linux 系统的启动参数 倒数第二行 中加入 nomodset 安装界面分辨率会有问题 xff0c 但这个之后再解决 安装过程中 xff0c 如果需要拖拽窗口 Al
  • 树莓派ubuntuMATE 安装xrdp来进行显示图形的远程调试

    树莓派ubuntuMATE 安装xrdp来进行显示图形的远程调试 引 在树莓派上调试显示图形界面的项目 xff0c 纠结配显示器的问题 pi本身有hdmi的接口 xff0c 如果有多余的显示器直接连接的那最好 xff0c 倘若接口不合适也可
  • C与C++源文件的拼接

    C 43 43 与C处理函数名 如果C 43 43 两个cpp源文件中函数名称相同 xff0c 会出现如下错误 xff08 ave就是函数名 xff09 34 int cdecl ave void 34 ave 64 64 YAHXZ 已经