C++与C的相互调用

最近调用一个C写的模块,加入C++工程中冒出许多错。原来是自己没有弄清楚C++调用C的方式。

 

文件后缀,C++为cpp, C为.c 。这个不要改变。

 

在C++中调用C 一般使用 extern  "C"{}

 

示例:

 

1,C++中调用C

在C++包含C文件时 加上 extern "C"{}即可

 

eg:

 

/* c语言头文件:cTest.h */
#ifndef C_TEST_H
#define C_TEST_H
extern int max(int x,int y);
#endif
/* c语言实现文件:cTest.c */
#include "cTest.h"
int max( int x, int y )
{
 return x > y ? x : y;
}


// c++实现文件,调用add:cppFile.cpp
extern "C" 
{
 #include "cTest.h"
}
int main(int argc, char* argv[])
{
 max(1,10); 
 return 0;


如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern "C" { }。 

 

2, C中调用C++

 

在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,即不要#include"" , 应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。

 

eg:

 

//C++头文件 cppTest.h
#ifndef CPP_TEST_H
#define CPP_TEST_H
extern "C" int max( int x, int y );
#endif


//C++实现文件 cppTest.cpp
#include "cppTest.h"
int max( int x, int y )
{
 return x > y? x : y;
}


/* C实现文件 cFile.c
/* 这样会编译出错:#include "cTest.h" */
extern int max( int x, int y );


int main( int argc, char* argv[] )
{
 add( 1, 10 ); 
 return 0;
}  

 

直接加extern 就可。

/

其实这个主要是因为C++与C编译阶段产生的目标符号不同,对于一个函数int max(int a, int b); C++编译产生的符号是_max_int_int 等等经过加入参数类型,参数个数的符号;而C中直接为_max;所以为了能在C++中或是在C中能顺利找到调用的函数或变量,就需要使用extern "C" 来改变调用的符号。 例如在C++中,如果加了extern "C",那么就按C的方式生成和查找。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值