当前位置:   article > 正文

如何用C语言封装 C++的类(C调用C++函数)、(C++调用C函数)_c封装c++函数

c封装c++函数

1、C调用C++

本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在  wrapper的实现文件里实现。

  1. //------apple.h
  2. #ifndef __APPLE_H__
  3. #define __APPLE_H__
  4. class Apple
  5. {
  6. public:
  7.     enum
  8.     {
  9.         APPLE_COLOR_RED,
  10.         APPLE_COLOR_BLUE,
  11.         APPLE_COLOR_GREEN,
  12.     };
  13.  
  14.     Apple();
  15.     int GetColor(void);
  16.     void SetColor(int color);
  17. private:
  18.     int m_nColor;
  19. };
  20. #endif 
  1. //-----apple.cpp:
  2. #include "apple.h"
  3. Apple::Apple():m_nColor(APPLE_COLOR_RED)
  4. {
  5. }
  6.  
  7. void Apple::SetColor(int color)
  8. {
  9.     m_nColor = color;
  10. }
  11.  
  12. int Apple::GetColor(void)
  13. {
  14.     return m_nColor;
  15. }
  1. //-----AppleWrapper.h
  2. #ifndef _APPLE_WRAPPER_H__
  3. #define _APPLE_WRAPPER_H_
  4. struct tagApple;
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. struct tagApple *GetInstance(void);
  9. void ReleaseInstance(struct tagApple **ppInstance);
  10. extern void SetColor(struct tagApple *pApple, int color);
  11. extern int GetColor(struct tagApple *pApple);
  12. #ifdef __cplusplus
  13. };
  14. #endif
  15. #endif
  1. //-----AppleWrapper.cpp
  2. #include "AppleWrapper.h"
  3. #include "apple.h"
  4.  
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. struct tagApple
  9. {
  10.     Apple apple;
  11. };
  12. struct tagApple *GetInstance(void)
  13. {
  14.     return new struct tagApple;
  15. }
  16. void ReleaseInstance(struct tagApple **ppInstance)
  17. {
  18.     delete *ppInstance;
  19.     *ppInstance = 0;
  20.     
  21. }
  22. void SetColor(struct tagApple *pApple, int color)
  23. {
  24.     pApple->apple.SetColor(color);
  25. }
  26.  
  27. int GetColor(struct tagApple *pApple)
  28. {
  29.     return pApple->apple.GetColor();
  30. }
  31. #ifdef __cplusplus
  32. };
  33. #endif
  1. //-----test.c
  2. #include "AppleWrapper.h"
  3. #include <assert.h>
  4.  
  5. int main(void)
  6. {
  7.     struct tagApple * pApple;
  8.     pApple= GetInstance();
  9.     SetColor(pApple, 1);
  10.     int color = GetColor(pApple);
  11.     printf("color = %d\n", color);
  12.     ReleaseInstance(&pApple);
  13.     assert(pApple == 0);
  14.     return 0;
  15. }

可以用 GCC编译:
g++ -c apple.cpp
g++ -c apple.cpp  AppleWrapper.cpp
gcc test.c -o test AppleWrapper.o apple.o -lstdc++

其实,  wrapper里的 struct 完全可以不要,定义一个  handle更好:

  1. //-----AppleWrapper.h
  2. #ifndef _APPLE_WRAPPER_H__
  3. #define _APPLE_WRAPPER_H_
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. int  GetInstance(int *handle);
  8. void ReleaseInstance(int *handle);
  9. extern void SetColor(int handle, int color);
  10. extern int GetColor(int handle);
  11. #ifdef __cplusplus
  12. };
  13. #endif
  14. #endif
  1. //-----AppleWrapper.cpp
  2. #include "AppleWrapper.h"
  3. #include "apple.h"
  4. #include <vector>
  5.  
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9.  
  10. static std::vector<Apple *> g_appleVector;
  11.  
  12. int GetInstance(int * handle)
  13. {
  14.     g_appleVector[0] =  new Apple;
  15.     *handle = 0;
  16.     return 1;
  17. }
  18. void ReleaseInstance(int *handle)
  19. {
  20.     delete g_appleVector[*handle];
  21.     *handle = -1;
  22.     
  23. }
  24. void SetColor(int handle, int color)
  25. {
  26.     g_appleVector[handle]->SetColor(color);
  27. }
  28.  
  29. int GetColor(int handle)
  30. {
  31.     return g_appleVector[handle]->GetColor();
  32. }
  33. #ifdef __cplusplus
  34. };
  35. #endif

2、C++调用C函数实例

  1. // --------------cfun.h
  2. #ifndef __C_FUN_20180228_H__
  3. #define __C_FUN_20180228_H__
  4.  
  5. #ifdef __cplusplus
  6. extern "C"{
  7. #endif // __cplusplus
  8.  
  9.     void cfun();
  10. #ifdef __cplusplus
  11. }
  12. #endif
  13.  
  14.  
  15. #endif


cfun.h头文件中,使用了条件编译#ifdef __cplusplus, 表示如果是C++来调用该接口,则该函数接口经编译后的函数符号生成规则按照C风格走, 否则没有extern "C" , 这样提供的接口同时支持C和C++两者的调用。

  1. // --------------cfun.c
  2. #include "cfun.h"
  3. #include <stdio.h>
  4.  
  5. void cfun()
  6. {
  7.     printf("hello world.\n");
  8. }
  1. // --------------main.cpp
  2. #include <iostream>
  3. #include "cfun.h"
  4.  
  5.  
  6. int main()
  7. {
  8.     cfun();
  9.     system("pause");
  10.     return 0;
  11. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/392628
推荐阅读
相关标签
  

闽ICP备14008679号