zoukankan      html  css  js  c++  java
  • C和C++混合编译问题

    在C语言中,编译器对于函数 int test()和int test(int a)的编译结果得到的函数名是一样的,所以C语言不能重载

    而在C++中int test()和int test(int a)编译后生成不同名字的函数,所以支持重载

    1.这就产生了问题,如果在C++中调用C语言的int test(int a)函数,会连接错误,因为编译后找不到对应名称的函数(c和cpp生成的函数名不同)

    所以需要在CPP文件中如果要使用int test(int a)函数,需要在(include下面)用extern "C" int test(int a)

    如果调用的C函数特别多,也可以用下面的方式声明

    extern "C"

    {

    需要调用的c语言函数

    int test(int a);

    }

    或者

    extern "C"

    {

     #include "XXX.h"

    这样会把XXX.h里面声明的函数都变成C函数生成规则

    }

    2.如果要在.c文件中需要调用CPP函数需要在.cpp文件中用extern "C"{

    cpp函数的实现

    }

    然后系统在编译这个函数的时候就会自动按照C语言的规则进行编译

    3.如果要写一套函数库,同时提供给C和CPP使用,那必须用C语言规则进行编译

    如果是写在CPP文件中的,必须要加extern "C"声明

    --1.在cpp文件中加上extern,让函数编译是用c规则编译

    --2.在调用者的cpp文件中用extern "C"{include 引入头文件}

    4.但是3的实现比较麻烦,只要调用通用函数就得在调用者的cpp文件中用extern引入头文件

    解决方法:在通用函数的.h和.cpp文件中,都用extern来声明--(但是此时就会让c调用不了通用函数,因为c里面没有extern,c包含的头文件包含extern,所以编译通不过)

    所以要在通用函数的.h文件里面用

    #ifdef __cplusplus

    extern "C" {

    #endif

    int sum(int, int);

    #ifdef __cplusplus

    }

    #endif

    因为cpp在编译时会自动生成__cplusplus这个宏,所以利用这一点,可以实现c文件中不包含extern

    cpp中包含extern

  • 相关阅读:
    推荐文章:深入浅出REST
    推荐Fowler作序的新书《xUnit Test Patterns》
    测试替身:Test Double
    踢毽也能治胃病,适当的运动带来健康,健康带来快乐
    10分钟入门AOP:用PostSharp普及一下AOP
    推荐一本新的英文版算法书和一本讲debug的书
    emacs开发rails的演示
    转:一个土木工程师在四川地震灾后的思考
    多语言多范型编程PPP
    巧用editplus学习正则表达式
  • 原文地址:https://www.cnblogs.com/xyzaijing/p/3603680.html
Copyright © 2011-2022 走看看