C&C++互相调用

C&C++互相调用,第1张

C&C++互相调用

1. C++调用C
  1. 可以认为C++向下兼容C,C的语法在C++中基本都可以使用,所以在C++中调用C相对较简单。


    区别在于,由于C++的功能特性,编译时对C函数和C++函数的处理不同,导致不能直接调用,否者会出现找不到函数的问题。


    解决方法也很简单,那就是显式的指定以C的格式去调用函数。


    示例如下:

    "test.c"
    void cpp_call_c_test(int a)
     {
         printf("cpp_call_c_test:%d\n", a);
     }
    
     "test.h"
     #ifdef __cplusplus
     extern "C"{
     #endif
     void cpp_call_c_test(int a);
     #ifdef __cplusplus
     }
     #endif
    
     "main.cpp"
     #include "test.h"
     int main()
     {  
         cpp_call_c_test(1);
         return 0;
     }
    
    如上述示例,分为test.ctest.hmain.cpp三个文件,只需要在test.h中声明函数时,用extern "C"{}将要被C++调用的函数括起来。


    然后在C++中就可以调用了。


2. C调用C++
  1. C调用C++根据情况的不同,可能会相对麻烦一些。


    如果是调用非成员函数,参数也没什么特殊,那么加上extern "C"{}声明后,也就可以直接调用了,如果是成员函数,或者函数参数中存在类等C不支持的类型,又或者是重载函数之类的,那么就需要再封装一层,将函数转换成C支持的函数样式就好了。


    示例如下:

    "test.cpp"
    void c_call_cpp_test(int a)
    {
        std::cout << "c_call_cpp_test:" << a << std::endl;
    }
    
    "test.h"
    #ifdef __cplusplus
    extern "C" {
    #endif
    void c_call_cpp_test(int a);
    #ifdef __cplusplus
    }
    #endif
    
    "main.c"
    #include "test.h"
    int main()
    {  
        c_call_cpp_test(1);
        return 0;
    }
    
    如上述示例,只是表示了最简单的C调用C++非成员函数的示例,其它一些不能直接调用的类型,也可以通过再封装一层转换成非成员函数然后进行调用。


    包括像想要调用一些C++写的第三方程序或库,其提供的头文件中往往包含着各种类的定义和一些C++才有的数据类型,这时就无法直接在原头文件中用extern "C"{}对想要调用的函数进行声明然后在C中包含这个头文件,因为在C中是不支持类这种东西的,包含后编译时会报错,解决方法也是再封装一层,避免出现一些C不支持的东西。



  • 没有什么问题是封装一层不能解决的,如果有,那就再封一层。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/584981.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存