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

C与C++混合编译

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

   http://blog.youkuaiyun.com/keensword/article/details/401114

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

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

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


    #include <stdio.h>  
      
    int i = 1;  
      
    void func()  
    {  
        printf("%d",i++);  
    }  

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

    #include "stdafx.h"  
    #include <stdio.h>  
    #include <iostream>  
    using namespace std;  
    //#include "devVar.h"  
    //extern int i;  
    //extern void func();  
      
    extern "C"  
    {  
        extern int i;  
        extern void func();  
        //#include "devVar.h"   
    }  
    int main(void)  
    {  
        for (int x = 0;x < 10; x++)  
        {  
            func();  
        }  
    }  
  所以在C++文件中编译C文件需要使用extern "C"关键字,声明语法如下所示

    extern "C"

    {

        采用C语言实现的内容

    }

 

    方法二、

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

    devVar.h头文件内容为:

    #include <stdio.h>  
      
    int i = 1;  
      
    void func()  
    {  
        printf("%d",i++);  
    }  

extern.cpp文件内容如下所示

    #include "stdafx.h"  
    #include <stdio.h>  
    #include <iostream>  
    using namespace std;  
    //#include "devVar.h"  
    //extern int i;  
    //extern void func();  
      
    extern "C"  
    {  
        //extern int i;  
        //extern void func();  
        #include "devVar.h"   
    }  
    int main(void)  
    {  
        for (int x = 0;x < 10; x++)  
        {  
            func();  
        }  
    }  
   其中,包含C语言头文件的方式为:

extern "C"  
{  
    //extern int i;  
    //extern void func();  
    #include "devVar.h"   
}
写到这里,楼主又产生了一个疑问,上面的例子讲的是C++调用C实现的代码,那如果是C调用C++编写的代码呢?

    楼主作了如下改动:

    devVar.cpp代码为:
int i = 1;  
  
void func()  
{  
    printf("%d",i++);  
}  
extern.c文件代码为
    #include <stdio.h>  
      
    extern int i;  
    extern void func();  
      
    int main(void)  
    {  
        int x = 0;  
        for (;x < 10; x++)  
        {  
            func();  
        }  
    }  

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

    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文件如下所示:

 #include <stdio.h>  
  
    int i = 1;  
  
  
extern "C" void func()  
    {  
        printf("%d",i++);  
    }  

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

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

    #include "stdafx.h"  
    #include <iostream>  
    using namespace std;  
      
    int i = 1;  
      
    extern "C" void func()  
        {  
            cout << "i = " << i++ << endl;  
        }  


原文地址:http://blog.youkuaiyun.com/sruru/article/details/7951019


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值