原创 C和C++混合编程(error C2059: syntax error : 'string')

2010-2-23 17:07 14551 13 14 分类: 软件与OS

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


CC++混合编程


extern "C"表示编译生成的内部符号名使用C约定。C++支持函数重载,而C不支持,两者的编译规则也不一样。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。下面以例子说明,如何在C++中使用C的函数,或者在C中使用C++的函数。


 一://C++引用C函数的例子(C++调用Cextern "C" 的作用是:让C++连接器找调用函数的符号时采用C的方式 )


//test.c


#include <stdio.h>


void mytest()


{


 printf("mytest in .c file ok\n");


}


//main.cpp


extern "C"


{


void mytest();


}


int main()


{


 mytest();


 return 0;


}


上述也可以加个头文件


//test.h


void mytest()


在后在main.cppextern "C"


{


#include “test.h”


}


 


二://C中引用C++函数(C调用C++,使用extern "C"则是告诉编译器把cpp文件中extern "C"定义的函数依照C的方式来编译封装接口,当然接口函数里面的C++语法还是按C++方式编译)


C中引用C++语言中的函数和变量时,C++的函数或变量要声明在extern "C"<?xml:namespace prefix = st1 ns = "isiresearchsoft-com/cwyw" />{}里,但是在C语言中不能使用extern "C",否则编译出错。(出现错误: error C2059: syntax error : 'string',这个错误在网上找了很久,国内网站没有搜到直接说明原因的,原因是extern "C"C++中的关键词,不是C的,所有会出错。那怎么用?看本文,或者搜extern "C")


//test.cpp


#include <stdio.h>


extern "C"


{


void mytest()


{


 printf("mytest in .cpp file ok\n");


}


}


//main.c


void mytest();


int main()


{


 mytest();


 return 0;


}


三.//综合使用


一般我们都将函数声明放在头文件,当我们的函数有可能被CC++使用时,我们无法确定被谁调用,使得不能确定是否要将函数声明在extern "C"里,所以,我们可以添加


#ifdef __cplusplus


 extern "C"


 {


 #endif


//函数声明


#ifdef __cplusplus


 }


 #endif


这样的话这个文件无论是被CC++调用都可以,不会出现上面的那个错误:error C2059: syntax error : 'string'


如果我们注意到,很多头文件都有这样的用法,比如string.h,等等。


//test.h


#ifdef __cplusplus


#include <iostream>


using namespace std;


 extern "C"


 {


 #endif


void mytest();


#ifdef __cplusplus


 }


 #endif


这样,可以将mytest()的实现放在.c或者.cpp文件中,可以在.c或者.cpp文件中include "test.h"后使用头文件里面的函数,而不会出现编译错误。


//test.c


#include "test.h"


void mytest()


{


#ifdef __cplusplus


 cout << "cout mytest extern ok " << endl;


#else


 printf("printf mytest extern ok n");


#endif


}


//main.cpp


#include "test.h"


int main()


{


 mytest();


 return 0;


}


 


关于C++引用C函数和变量的例子还有一个(来自网上,可以google


两个文件:


c文件:C.c
***********************************************
int external="5"; //
全局变量,缺省为extern
int func() //
全局函数,缺省为extern
{
return external;
}
***********************************************
cpp
文件:CPP.cpp
***********************************************
#include "iostream"
using namespace std;
#ifdef __cplusplus
extern "C"
{
#endif
extern int external; //告诉编译器extern是在别的文件中定义的int,这里并不会为其分配存储空间。
extern int func(); //虽然这两个都是在extern "C"{}
里,但是仍然要显式指定extern,否则报错。
#ifdef __cplusplus //
不仅仅是函数,变量也要放在extern "C"中。
}
#endif


void main(void)
{
cout<<"the value of external in c file is: "<<EXTERNAL<<ENDL;
external=10;
cout<<"after modified in cpp is : "<<FUNC()<<ENDL;
}
***********************************************


 


externC/C++语言中表明函数和全局变量作用范围(可见性)的关键字.,它告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。


1。对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配内存空间。如果该变量定义多次,会有连接错误


2。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。也就是说c文件里面定义,如果该函数或者变量与开放给外面,则在h文件中用extern加以声明。所以外部文件只用includeh文件就可以了。而且编译阶段,外面是找不到该函数的,但是不报错。link阶段会从定义模块生成的目标代码中找到此函数。


3。与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。


 


 


本文部分内容来自:http://blog.csdn.net/vvincol/archive/2007/09/16/1787093.aspx


http://blog.csdn.net/DotScylla/archive/2009/10/11/4649401.aspx


http://blog.csdn.net/Welkin_Weng/archive/2005/12/18/555667.aspx

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-12-29 10:11

就是根据“error C2059: syntax error : 'string'”搜到这的,学习了!!!
相关推荐阅读
hongqi1029_800556847 2013-12-24 14:13
类似CR2032这样的型号的含义
类似CR2032这样的型号,其含义如下:LR——碱性锂-锰一次性纽扣电池,电压1.5V;CR——锂-二氧化锰一次性纽扣电池,电压3.0V,年平均容量降低不大于2%,储存寿命长;SR——锌-氧化银一...
hongqi1029_800556847 2013-06-14 09:25
4~20ma的压控电流源电路
4~20ma的压控电流源电路   利用输入电压Vi(0~5v)控制输出电流Io(4~2Oma),且当输入电压固定时,输出电流不随负载RL的变化而变化。        输出电流的最...
hongqi1029_800556847 2012-08-30 20:30
智慧之花---名言(自省二)
不要评价别人的家庭,因为那和你无关。   不要评价别人的学问,因为世上最不缺的就是学问。   总之,不要评价任何人,哪怕是你的家人。   不要乱花钱,因为明天你就可能失业。    不要趾高...
hongqi1029_800556847 2012-08-13 17:51
浅谈单片机应用程序架构(本文转载自我心永恒)
浅谈单片机应用程序架构(一) 本文转载自我心永恒《浅谈单片机应用程序架构(原创)》 对于单片机程序来说,大家都不陌生,但是真正使用架构,考虑架构的恐怕并不多,随着程序开发的不断增多,本人觉得架构...
hongqi1029_800556847 2012-07-21 11:37
我得生活提醒
1.与人交谈处事,注意表达和表情,好意别给人相反得理解!!! 2.与人相处不高兴时,先反着想,比如我对人家是否尊重,我是否态度好,因为别人的反映可能是我的反映的镜像  3.任何你今日的任性,疏忽,或者...
hongqi1029_800556847 2012-07-21 10:59
自省
        1.为什么和人相处久了,一产生矛盾,就总可能把他得缺点老想来想去呢?为什么不去记人家得好呢?和陌生人反而不会这样呢?朋友,你有什么方法,对付这种情绪呢,毕竟人都不是完人啊!说说你的...
EE直播间
更多
我要评论
1
13
关闭 站长推荐上一条 /1 下一条