[英]Regarding C++ class access/manipulation in C
我已經在Stack Overflow上閱讀了幾個星期的問題......這將是我的第一個問題。
所以最近我研究了C訪問/操作C ++類。 我理解理想情況下,在正常情況下,不應該單獨用C和C ++編譯組件,但目前這不是一個選項。
我查看了有關能夠在C中移植/使用C ++的3個教程。它們是:
DevX上的 “C ++和C互操作性指南”
Sun網站上的 “在同一程序中混合使用C和C ++代碼”一文。
“[32]如何在Parashift上混合使用C和C ++”
首先,我已經知道:
您必須使用extern“C”來避免C ++函數名稱重整。
您需要與C兼容的回調原型。
G ++必須將C ++編譯成.o文件,GCC將特定於C的代碼編譯成.o文件,然后將它們鏈接起來。
結果,我的項目由4個文件組成:
這是我輸入的代碼,然后是我的問題:
foo.h中
// Header File foo.h
#ifndef FOO_H
#define FOO_H
//Content set inside this #ifdef will be unseen by C compilers
#ifdef __cplusplus
class Foo
{
public:
void setBar(int);
void printBar();
private:
int bar;
};
#endif
//end of C++-only visible components.
#ifdef __cplusplus
extern "C" {
#endif
//Stuff made to be seen by C compilers only. fooWrap.c has definitions.
#if defined(__STDC__) && !defined(__cplusplus)
typedef struct Foo Foo;
//C-wrappers for C++ callback functions.
Foo * c_NewFoo();
void c_SetFooBar( Foo *, int);
void c_PrintFooBar( Foo *);
#endif
//These are the functions C++ AND C can both use...
Foo * newFoo(); //allocates the memory for Foo class, pass address back.
void setFooBar( Foo * , int ); //set internal contents of Foo object.
void printFooBar ( Foo * ); //print internal contents of Foo object.
#ifdef __cplusplus
}
#endif
#endif /*FOO_H*/
TEST.C
#include "foo.h"
// test.c test file for wrappers that manipulate C++ objects.
main()
{
//looks very C++ like... this makes C-Programmers cringe doesn't it?
Foo * cfoo = c_NewFoo();
Foo * cppfoo = newFoo();
//using the C-specific wrappers.
c_SetFooBar(cfoo,31415);
c_PrintFooBar(cfoo);
//using the C/C++ callback functions to Foo objects.
setFooBar(cppfoo,9001);
printFooBar(cppfoo);
}
所以我將定義分成4個文件,正如我之前提到的......它編譯得很好。 但這是我不太了解的。
為什么sun和parashift文章建議創建C-Wrappers,其唯一的代碼是將它的參數傳遞給C / C ++兼容函數,然后調用C ++特定代碼?
即
//in Stuff.cpp
void CallCppStuff () { /* c++ stuff */ }
//in wrapStuff.c
wrapCppStuff() { CallCppStuff() }
正如你從我的test.c文件中看到的那樣......我能夠在沒有問題的情況下調用任何一組調用(據我所知)。 c_包裝器是不必要的開銷,還是我完全錯過了它們的全部內容? 我的唯一猜測是與C / C ++的指針尋址方案有關......但我不確定。
此外,我想還有更多的問題,除此之外...但這三個網站都是我能找到的特定問題。 因此,如果我有任何其他明顯的疏忽,我會很感激他們的提及。
提前感謝任何幫助/建議,CX
如果您有一系列非面向對象的函數或在命名空間中,則無需再次包裝它們。 您的c_系列函數是多余的。
任何外部C的C ++函數都具有全局(即非命名空間/靜態成員)鏈接,並且只采用C-compat數據類型(通常我們使用像你一樣的不透明指針),然后它不需要被包裝。 那是包裝功能。 C ++直接使用成員函數,不需要使用它們,它們當然不需要被欺騙。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.