在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++的代码文件中才起作用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值