当前位置:编程学习 > C/C++ >>

再论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的方式链接。

 

摘自 canmeng50401的专栏

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,