如何在C++中调用C函数
这是程序员面试宝典中的一道题,查资料得到解决方法:
注意这里的C调用C++或者C++调用C意思是.c文件中调用.cpp文件中代码,或者相反。
集成开发环境如VC++6.0或者vs都是以文件后缀来区别当前要编译的是C代码还是C++代码,然后采用响应的编译、调用协议等。
使用extern “C” 主要是因为C编译器编译函数时不带参数的类型信息,只包含函数的符号名字。如
int foo( float x )
C编译器会将此函数编译成类似_foo
的符号,C连接器只要找到了调用函数的符号,就认为连接成功。
而C++编译器为了实现函数重载,会在编译时带上函数的参数信息。如它可以把上面的函数编译成类似于_foo_float
这样的符号。
所以,C调用C++,使用extern "C"
则是告诉编译器依照C的方式来编译封装接口,当然接口函数里面的C++语法还是按C++方式编译。
这个函数文件名是Cpptest.cpp.
#include <iostream>
using namespace std;
#ifdef __cplusplus
extern "C"{
#endif
int f(int x, int y)
{
return x + y;
}
#ifdef __cplusplus
}
#endif // __cplusplus
void main()
{
int temp;
temp = f(1, 2);
cout << "mgl"<<temp<<endl;
}
对应的汇编程序如下:
void main()
15: {
012A2640 push ebp
012A2641 mov ebp,esp
012A2643 sub esp,0CCh
012A2649 push ebx
012A264A push esi
012A264B push edi
012A264C lea edi,[ebp-0CCh]
012A2652 mov ecx,33h
012A2657 mov eax,0CCCCCCCCh
012A265C rep stos dword ptr es:[edi]
16: int temp;
17: temp = f(1, 2);
012A265E push 2
012A2660 push 1
012A2662 call _f (012A1037h) 这里就是上面的C程序编译的结果,如果是c++,是没有前面的 下划线的。
012A2667 add esp,8
012A266A mov dword ptr [temp],eax
18: cout << "mgl"<<temp<<endl;
```
所以总结如下,标准的调用方法是:
```
#ifdef __cplusplus //注意这里的 __cplusplus是C++编译器本身的宏定义。
extern "C"{
#endif
int f(int x, int y)
{
return x + y;
}
#ifdef __cplusplus
}
#endif // __cplusplus