再论extern “C”:C代码调用C++代码

首先简单说明两点:
1.   编译器编译的基本单位是一个C文件或Cpp文件,并不对头文件进行编译。
2.   extern “C”只能被C++编译器处理,C编译器并不认识这个标志。

 还是使用上次分享的那篇文章中的示例代码,代码如下:
/*CppHeader.h*/
#ifndef CPP_HEADER
#define CPP_HEADER

extern "C" void print(int i);

#endif CPP_HEADER

/*CppHeader.cpp*/
#include "cppHeader.h"
#include <stdio.h>
#include <iostream.h>
void print(int i)
{
    printf("cppHeader %d\n",i);
}

/*c.c*/
extern void print(int i);
int main(int argc,char** argv)
{
    print(3);
    return 0;
}

还是有3个文件:CppHeader.h,CppHeader.cpp和c.c。使用下面的命令手工那个手工进行编译和链接:
cl /c /Tp CppHeader.cpp
cl /c /Tc c.c
link c.obj CppHeader.obj
会生成c.exe文件,而且运行正常。
现在,我们把CppHeader.cpp中的#include “cppHeader.h”去掉。再进行编译,还是同样的命令,就发现不会生成c.exe文件了。提示的错误为:
c.obj : error LNK2001: unresolved external symbol _print
c.exe : fatal error LNK1120: 1 unresolved externals
前后比较一下,我们发现只要在CppHeader.cpp文件中加入一句 extern “C” void print(int i) ,程序就能够正常编译链接了。extern “C” 告诉C++编译器,你把print()函数按照C的方式来编译吧。这样,C++编译器就把print(int i)这个函数编译为_print符号了,使用dumpbin工具可以看出来。
小小总结一些extern “C”的作用:
在某个C++源文件中,如果有extern “C”语句,那很可能有两种情况:
1.被extern “C”修饰的函数在本文件中实现,那么C++编译器就把这个函数按照C的方式来进行编译,本文件中别的函数调用此函数时按照C的方式来调用,或者说,按照C的方式链接。
2.被extern “C”修饰的函数在其它文件中实现,那么本文件中的函数调用此函数,就按照C的方式来调用,或者说,按照C的方式链接。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值