Passing C++ objects to/from C function
Here’s an example
Fred.h:
/* This header can be read by both C and C++ compilers */
#ifndef FRED_H
#define FRED_H
#ifdef __cplusplus
class Fred {
public:
Fred();
void wilma(int);
private:
int a_;
};
#else
typedef
struct Fred
Fred;
#endif
#ifdef __cplusplus
extern ”C” {
#endif
#if defined(__STDC__) || defined(__cplusplus)
extern void c_function(Fred*); /* ANSI C prototypes */
extern Fred* cplusplus_callback_function(Fred*);
#else
extern void c_function(); /* K&R style */
extern Fred* cplusplus_callback_function();
#endif
#ifdef __cplusplus
}
#endif
#endif /*FRED_H*/
Fred.cpp:
// This is C++ code
#include ”Fred.h”
Fred::Fred() : a_(0) { }
void Fred::wilma(int a) { }
Fred* cplusplus_callback_function(Fred* fred)
{
fred->wilma(123);
return fred;
}
main.cpp:
// This is C++ code
#include ”Fred.h”
int main()
{
Fred fred;
c_function(&fred);
…
}
c-function.c:
/* This is C code */
#include ”Fred.h”
void c_function(Fred* fred)
{
cplusplus_callback_function(fred);
}
Unlike your C++ code, your C code will not be able to tell that two pointers point at the same object unless the pointers are exactly the same type. For example, in C++ it is easy to check if a Derived* called dp points to the same object [...]
Archive for the ‘Interfacing C & C++’ Category
Accessing C++ objects from C
Posted in Interfacing C & C++
How can I call a C function f(int,char,float) from my C++ code?
If you have an individual C function that you want to call, and for some reason you don’t have or don’t want to #include a C header file in which that function is declared, you can declare the individual C function in your C++ code using the extern “C” syntax. Naturally you need to use [...]
Continue Reading..
Posted in Interfacing C & C++
What do I need to know when mixing C and C++ code?
Here are some high points (though some compiler-vendors might not require all these; check with your compiler-vendor’s documentation):
You must use your C++ compiler when compiling main() (e.g., for static initialization)
Your C++ compiler should direct the linking process (e.g., so it can get its special libraries)
Your C and C++ compilers probably need to come from same [...]
Posted in Uncategorized