簡體   English   中英

在C中使用C ++結構

[英]Using C++ struct in C

我有一個C++結構,里面有方法:

struct S
{
   int a;
   int b;

   void foo(void)
   {
       ... 
   };
}

我有一個用C編寫的用戶程序。 是否有可能獲得指向S -struct的指針並訪問成員ab

您可以從C程序訪問用C ++編寫的struct的成員, struct是確保刪除了對結構語法的C ++添加:

// header
struct S {
  int a, b;

#ifdef __cplusplus
  void foo(); 
#endif
};

// c-file:
#include "header.h"

void something(struct S* s)
{
  printf("%d, %d", s->a, s->b);
}

C ++中結構和類的內存布局與C語言的C部分兼容。 只要在結構中添加vtable(通過添加虛函數),它就不再兼容,您必須使用其他一些技術。

如果這些方法不是虛擬的,則可以。 您甚至可以使用__cplusplus宏來獲得C / C ++的通用標頭:

struct S
{
   int a;
   int b;

#ifdef __cplusplus
   void foo(void)
   {
       ... 
   }
#endif /* end section for C++ only */
};

請記住,C中此結構的名稱是struct S而不僅僅是S

如果您的程序是用C語言編寫的,那么如何獲得S? 我的猜測是,最精確的描述是您的程序是用C和C ++混合編寫的,並且您希望訪問C部分中C ++結構的某些成員。

解決方案1:修改你的C部分,使它在C和C ++的公共子集中,將結果編譯為C ++,現在你可以逐步使用你想要的任何C ++特性。 這就是許多項目過去所做的事情。 最知名的是GCC。

解決方案2:為S提供外部“C”接口並在C部分中使用它。

#ifdef __cplusplus
extern "C" {
#endif
    struct S;
    int getA(S*);
    int getB(S*);
#ifdef __cplusplus
}
#endif

提供getA和getB實現的部分必須編譯為C ++,但可以從C調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM