如何在C++中调用C函数

如何在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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值