Re: c interface with c++ implementation
In article <Xns99686C4F6EA7wrybredgmailcom@216.196.97.142>, W. J. La
Cholter <witheld@giganews.com> wrote:
zade <zhaohongchao@gmail.com> wrote in news:1183973133.661511.170500
@g37g2000prf.googlegroups.com:
I want to create a library with c interface but with c++
implementation. But I don't know if there exist some potential
problems.
Any advice? thanks!
There are techniques to do this and maintain a fairly strong back-end
implementation. You'll be stuck reducing your API to extern "C"
declarations. Your public types will need to all be safely
implemented in C. A common approach, especially in operating systems
is to implement the Bridge pattern. All resources are managed through
something opaque. Consider:
struct FooHandle
{
void * handle;
};
You're free to implement the *Foo functions any way on the back-end.
At least by having a struct FooHandle, rather than typedef to void,
you make it harder to break encapsulation (e.g., pass a FooHandle to a
manipBar function).
This basically points to one of the big drawbacks of C: no
encapsulation of complex types.
Other problems: you're limited in the type of API you can present. No
operator overloading, no generic typing, no encapsulated inline
functions. Not a good fit with a huge chunk of the C++ Standard
Library: for C++ developers your API is like using the C Standard
Library to implement C++ code, i.e., a pain. You could also put C++
wrappers around this. Lots more code to maintain.
If the C++ API is also available in C++ compiled code, then the
C++ compiled code can use either [or both] API. Further the
C API becomes a wrapper to the C++ API which the C code cannot see.
This way the lib can be written first with C++ in mind and debugged then
adding the C interface can be tested, and problems of the C API be
fixed, modifying only the wrappers as needed, and fine tuning the C
API,
as needed.
As long as the pointers to C++ objects are passed arround as void
*'s in the C code and the representation of void * is compatible to
both
the C and C++ compilers there should be no problem. [It is very likely
that the representation of void * for the C and C++ compilers is the
same, but not strictly gauranteed.]
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]