C++基础学习之7 - 与C程序对话

来源:互联网 发布:侠盗飞车作弊软件 编辑:程序博客网 时间:2024/05/18 03:18

        C++当初设计该语言的初衷是 “C”扩展,所以C++一般被认为是C的超集,但“这并不意味着C++兼容C语言的所有东西”。C++保留了一部分过程式语言的特点,大部分的C代码可以很轻易地在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中无法通过编译。因此,从C到C++,我们要因为这些差异而做出一些改变,我们应当熟悉这些差异,使用原有的丰富的C库为现在的C++工程更好地服务。那么在C++程序中是否可以调用C程序代码呢?

        先不置可否,我们来看 C程序与C++程序不同的编译方式

        对于下面的函数:

void func_add(int a,int b);
        C程序在编译时会生成 _func_add 类型的符号;

        C++程序在编译时会生成 _func_add_int_int 类型的符号(这种机制为C++的函数重载提供了支持);

        这种符号不一致导致我们无法直接调用,我们在C++中调用C程序代码会出现问题,error LNK2019: 无法解析的外部符号,很熟悉吧。

        解决方案有木有?,这里面的桥梁就是 extern “C”修饰符 。extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。被extern "C" 修饰的变量和函数要按照C语言方式进行编译和链接

        在CPP中调用时,通过添加 extern “C” 指定里面的函数按照C风格编译:

/** c语言头文件:CAdd.h */#ifndef C_ADD_H#define C_ADD_H    extern int add(int a,int b);#endif/** C语言实现文件:CAdd.c */#include "CAdd.h"int add(int a,int b){    return a+b;}/** C++实现文件,调用add*/extern "C"{#include "CAdd.h"}int main(int argc, char* argv[]){    add(2,3);     return 0;}

        同样,当C++调用一个C生成的 DLL 时,也需要参照上面的方法修饰。

        我们在编写C代码的时候,由于在C语言中不支持 extern "C" 声明,为了让头文件同时兼容C和C++,我们一般会这样来实现:

#ifdef __cplusplusextern "C" {#endifint add (int a, int b);#ifdef __cplusplus}#endif
        通过添加 宏__cplusplus 进行条件判断,我们能够有效保证 头文件能够在C和C++中同时使用。
2 0
原创粉丝点击