如何混合编译C语言和C++

25 篇文章 18 订阅

如何混合编译C语言和C++

    实际开发过程中,C++中会调用C与语言编写的代码,我在网络上面找到一篇写得很好的文章

   http://blog.csdn.net/keensword/article/details/401114

   就着上面的例子,我使用C语言采用两种方法重写了一下。

   方法一、全局函数和变量在devVar.c文件中实现,在extern.cpp文件中使用extern关键字声明在devVar.c文件中定义的函数和变量。

   devVar.c文件的代码如下所示:

 

 

 
  1. #include <stdio.h>

  2.  
  3. int i = 1;

  4.  
  5. void func()

  6. {

  7. printf("%d",i++);

  8. }


extern.cpp文件中代码如下所示:

 

 
  1. #include "stdafx.h"

  2. #include <stdio.h>

  3. #include <iostream>

  4. using namespace std;

  5. //#include "devVar.h"

  6. //extern int i;

  7. //extern void func();

  8.  
  9. extern "C"

  10. {

  11. extern int i;

  12. extern void func();

  13. //#include "devVar.h"

  14. }

  15. int main(void)

  16. {

  17. for (int x = 0;x < 10; x++)

  18. {

  19. func();

  20. }

  21. }

  所以在C++文件中编译C文件需要使用extern "C"关键字,声明语法如下所示

    extern "C"

    {

        采用C语言实现的内容

    }

 

    方法二、

    在devVar.h文件中实现C代码(即devVar.h作为C语言头文件),在.cpp文件中包含C语言头文件。

    devVar.h头文件内容为:

 
  1. #include <stdio.h>

  2.  
  3. int i = 1;

  4.  
  5. void func()

  6. {

  7. printf("%d",i++);

  8. }


extern.cpp文件内容如下所示

 

 
  1. #include "stdafx.h"

  2. #include <stdio.h>

  3. #include <iostream>

  4. using namespace std;

  5. //#include "devVar.h"

  6. //extern int i;

  7. //extern void func();

  8.  
  9. extern "C"

  10. {

  11. //extern int i;

  12. //extern void func();

  13. #include "devVar.h"

  14. }

  15. int main(void)

  16. {

  17. for (int x = 0;x < 10; x++)

  18. {

  19. func();

  20. }

  21. }

   其中,包含C语言头文件的方式为:

 

 
  1. extern "C"

  2. {

  3. //extern int i;

  4. //extern void func();

  5. #include "devVar.h"

  6. }

写到这里,楼主又产生了一个疑问,上面的例子讲的是C++调用C实现的代码,那如果是C调用C++编写的代码呢?

    楼主作了如下改动:

    devVar.cpp代码为:

 
  1. int i = 1;

  2.  
  3. void func()

  4. {

  5. printf("%d",i++);

  6. }

extern.c文件代码为

 
  1. #include <stdio.h>

  2.  
  3. extern int i;

  4. extern void func();

  5.  
  6. int main(void)

  7. {

  8. int x = 0;

  9. for (;x < 10; x++)

  10. {

  11. func();

  12. }

  13. }


单独编译每个文件都通过,链接声称可执行文件的时候报错:

    1>extern.obj : error LNK2019: unresolved external symbol _func referenced in function _main,说明.c文件中extern void func(),按照C编译的规则,得到函数_func,而devVar.cpp文件采用C++编译方式,得到的函数为XX·!_func(具体楼主也不知道哈),这样链接的时候函数自然找不到,那怎么解决呢?

    需要在devVar.cpp中,明确调用extern "C"关键字,声明cpp文件中有关代码,需要按照C的方式来生成,修改devVar.cpp文件如下所示:

 
  1. #include <stdio.h>

  2.  
  3. int i = 1;

  4.  
  5.  
  6. extern "C" void func()

  7. {

  8. printf("%d",i++);

  9. }


此时,除了需要使用extern "C"声明编译的时候采用C方式编译外,.cpp文件中的代码可以按照C++方式编写,例如

     devVar.cpp按照下面方式写,也是正确的。

 
  1. #include "stdafx.h"

  2. #include <iostream>

  3. using namespace std;

  4.  
  5. int i = 1;

  6.  
  7. extern "C" void func()

  8. {

  9. cout << "i = " << i++ << endl;

  10. }

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值