在C++中如何使用C
如下代码:
/*C语言头文件:Max.h*/
#ifndef _MAX_H_
#define _MAX_H_
int Max(int nA,int nB)
#endif
/*C语言实现文件:Max.c*/
#include "Max.h"
int Max(int nA,int nB)
{
return((nA-nB)?(nA):(nB));
}
/*C++语言调用文件*/
#include "Max.h"
int _tmain(int argc,char* argv[])
{
int nMax = Max(1,2);
return 0;
}
上述代码在Visual C++中编译会出错(error LNK2019:无法解析的外部符号"int __cdecl Max(int,int)"(?Max@@YAHHH@Z),该符号在函数_wmain中被引用
如果把上述的Max.h代码修改如下:
/*C语言头文件*/
#ifndef __MAX_H__
#define __MAX_H__
#ifdef __cplusplus
extern "C"{
#endif
int Max(int nA,int nB);
#ifdef __cplusplus
};
#endif
#endif
编译通过
结论:在C++中调用C的代码必须把原来的C语言声明放到extern "C"{/*code*/}中,否则在C++中无法编译通过
原因:C和C++具有完全不同的编译和链接方式。C语言编译器编译函数时不带函数的类型和作用域信息,只包含函数符号名字;而c++编译器为了实现函数的重载,在编译时会带上函数的类型和作用域信息。
例如:假如某一函数原型为:int Func(int nA,int nB)
C语言编译器把函数编译成类似_Func的符号,C链接器只要找到这个符号就可以连接成功,实现调用。而在C++语言中,编译器会检查参数类型和作用域信息,上述函数原型会编译成_Z_Func_int_int这样的符号。在链接过程中,C++链接器会在函数原型所在模块生成的目标文件中查找__Z_Func_int_int.
总结:C++中调用C代码的3种具体实现方式
1.修改C代码的头文件,当其被用于C++代码时,在声明中加入exter "C" 上例中在Max.h中加入extern "C" int Max(int nA,int nB);
2.在C++代码中(Main.cpp)重新声明一下C函数,在重新声明时添加extern "C".
#include "Max.h"
extern "C" int Max(int nA,int nB);
3.在包含C头文件(Main.cpp)时,添加extern "C".
extern "C"{
#include "Max.h"
}
注意:extern "C" 一定要加在C++的代码文件中才起作用
在C++中如何使用C的更多相关文章
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- mapreduce中一个map多个输入路径
package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- .NET Core中的认证管理解析
.NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- 关于CryptoJS中md5加密以及aes加密的随笔
最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...
- In-Memory:在内存中创建临时表和表变量
在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
随机推荐
- libcurl get post http
一. 概念 1. 为什么要使用libcurl 1) 作为http的客户端,可以直接用socket连接服务器,然后对到的数据进行http解析,但要 ...
- COCOS2d-x简易安装步骤
准备工作:1. 下载 cocos2d-x 下载地址:http://cdn.cocos2d-x.org/cocos2d-x-2.2.zip2. 下载 python 2.7.3 下载地址:h ...
- uestc Palindromic String
字符串hash因为如果一个字符串是回文串,那么正着做哈希和反着做哈希结果应该一样.于是我们先正反各做一边哈希.如果判断出来一个字符串是回文穿那么这个字符串的前半部分和后半部分的重数一定相同,于是当前位 ...
- C语言 linux环境基于socket的简易即时通信程序
转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html ——By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易 ...
- HTML meta标签的用法及head中的一些常用标签
meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta主要为分HTTP标头信息(HTTP-EQUIV)和页面描述信息(NAME)标头信息包括文档类型.字符集.语言等浏览器正确显示网页的信 ...
- poj 1094 Sorting It All Out(图论)
http://poj.org/problem?id=1094 这一题,看了个大牛的解题报告,思路变得非常的清晰: 1,先利用floyd_warshall算法求出图的传递闭包 2,再判断是不是存在唯一的 ...
- 设置ToggleButton、Switch、CheckBox和RadioButton的显示效果
ToggleButton.Switch.CheckBox和RadioButton都是继承自android.widget.CompoundButton,意思是可选择的,因此它们的用法都很类似.Compo ...
- HDOJ2031进制转换
项目做久了,我发现自己对代码的实现能力越来越差劲了!经过前一段时间找工作的经历就能够明显感觉的到自己的代码熟练度不够!因此,今后要多加练习.要想做好一个优秀的程序猿就要多写程序,多思考. ★结题思路 ...
- Zookeeper 编程
ZooKeeper编程(一) 杂记 ZooKeeper的用途:distributed coordination;maintaining configuration information, namin ...
- 升级python的sqlite库版本
今天了解了一下用python获取chrome cookie信息,在研究的过程中,发现打开数据库失败,后来调查了一下发现是由于sqlite3库太老的缘故,起码需要3.8以上,然后看了一下python 2 ...