Re: Need to create a C lib - using C++ classes - is it possible
"Angus" <anguscomber@gmail.com> wrote in message
news:3cc390d2-129d-4fe7-a24f-99c02373a660@p25g2000hsf.googlegroups.com...
Hello
We have a lot of C++ code. And we need to now create a library which
can be used from C and C++. Given that we have a lot of C++ code
using classes how can we 'hide' the fact that it is C++ from C
compilers?
Can we have a C header file which uses the functionality of the C++
files and compile this into a lib file?
Can anyone give me some pointers as to how to get started?
You can try something like this:
<pseudo-code sketch>
________________________________________________________________
/* my_class.h
-------------------------------------------------------------*/
#ifndef MY_CLASS_H
#define MY_CLASS_H
#ifdef __cplusplus
# define EXTERN extern "C"
#else
# define EXTERN extern
#endif
typedef void* my_class_type;
EXTERN int my_class_create(my_class_type*)
EXTERN int my_class_destroy(my_class_type);
EXTERN int my_class_do_something(my_class_type);
#endif
/* my_class.hpp
-------------------------------------------------------------*/
#ifndef MY_CLASS_HPP
#define MY_CLASS_HPP
class my_class {
public:
my_class();
~my_class() throw();
void do_something();
};
#endif
/* my_class.cpp
-------------------------------------------------------------*/
#include "my_class.h"
#include "my_class.hpp"
#include <cstdio>
my_class::my_class() {
std::printf("(%p)->my_class::my_class()\n", (void*)this);
}
my_class::~my_class() throw() {
std::printf("(%p)->my_class::~my_class()\n", (void*)this);
}
void my_class::do_something() {
std::printf("(%p)->my_class::do_something()\n", (void*)this);
}
int my_class_create(my_class_type* _pcthis) {
try {
*_pcthis = new my_class;
} catch(...) {
return -1;
}
return 0;
}
int my_class_destroy(my_class_type _cthis) {
my_class* const _this = (my_class*)_cthis;
try {
delete _this;
} catch(...) {
return -1;
}
return 0;
}
int my_class_do_something(my_class_type _cthis) {
my_class* const _this = (my_class*)_cthis;
try {
_this->do_something();
} catch(...) {
return -1;
}
return 0;
}
________________________________________________________________
Now you can use it from C like:
________________________________________________________________
#include "my_class.h"
int main(void) {
my_class_type _this;
my_class_create(&_this);
my_class_do_something(_this);
my_class_destroy(_this);
return 0;
}
________________________________________________________________
Any thoughts?