1 /****test.cpp****/ 2 3 #include<iostream> 4 using namespace std; 5 extern "C" //利用C编译器的符号规则生成_value 6 { 7 int value(); 8 } 9 int main(){ 10 cout<<value()<<endl; 11 } 12 13 /* 14 extern 是C/C++语言中表明函数和全局变量作用范围(可见性) 15 的关键字,该关键字告诉编译器,其声明的函数和变量可以在"全局"范围使用。 16 17 例如:extern int a;是对全局变量a的声明语句. 18 19 extern "C"包含两重含义: 20 1、被它修饰的目标是"extern" 21 2、它修饰的目标是C 22 23 对于全局变量和函数,C语言与C++语言的编译、连接方式不同: 24 1、C++作为一种面向对象的语言,C++支持函数重载,而C语言则不支持。 25 因此,全局变量或函数被C++编译后在符号库中的名字与C语言不同。 26 2、C++除了支持全局变量外,还支持类的成员变量和局部变量。编译器在 27 进行编译时,对局部变量是通过局部变量在栈上距帧指针ebp的偏移量进行反问的, 28 对类的成员变量是通过其相对于对象首地址偏移量进行访问的。 29 */
1 /***** value.c ****/ 2 //因为是.c文件 所以对应于C的value()函数声明 3 int value(){ 4 return 5; 5 }
在C中调用C++函数:
1 /****invokecpp.h****/ 2 /* 3 使用C编译符号规则 4 */ 5 extern "C"{ 6 void show(); 7 }
1 /****invokecpp.cpp*****/ 2 #include<cstdio> 3 #include"invokecpp.h" 4 /* 5 为了让函数void show();能够被C语言程序调用,必须用 6 extern"C" 通知编译器采用C语言的规则解析函数名,这个 7 工作可在头文件invokecpp.h中完成。 8 */ 9 void show(){ 10 printf("Hello"); 11 }
/***main.c****/ /* 在C语言源文件main.c中,不能直接包含invokecpp.h 因为C语言不支持extern "C"声明。在.c文件中包含了extern "C"时 会出现编译错误。所以在main.c中,应直接进行函数原型声明,这样, 编译器可在所有参与连接的目标文件中寻找名字为_show的函数调用。 */ void show(); int main(){ show(); }