Past few days I have been "downgrading" > 1000 filem of C++ code into C. It's been going well until now. Suddenly I'm face to face with a class...
The compiler pointed out the error first in the header file:
class foobar {
foo mutex;
public:
foobar() {
oneCreate(&mutex, NULL);
}
~foobar() {
oneDestroy(mutex);
mutex = NULL;
}
void ObtainControl() {
oneAcquire(mutex);
}
voi开发者_运维知识库d ReleaseControl() {
oneRelease(mutex);
}
};
And of course, the C file has to take advantage of this
foobar fooey;
fooey.ObtainControl();
I don't even know where to start.... Help?
Turn foobar into a normal struct
struct foobar {
goo mutex;
};
Create your own "constructor" and "destructor" as functions that you call on that struct
void InitFoobar(foobar* foo)
{
oneCreate(&foo->mutex);
}
void FreeFoobar(foobar* foo)
{
oneDestroy(foo->mutex);
}
struct foobar fooStruct;
InitFoobar(&fooStruct);
// ..
FreeFoobar(&fooStruct);
etc
since C-structs can't have member functions, you can either make function pointers, or create non-member versions of those functions, ex:
struct foobar {
foo mutex;
};
Construct_foobar(foobar* fooey) {
oneCreate(&fooey->mutex, NULL);
}
Destroy_foobar(foobar* fooey) {
oneDestroy(fooey->mutex);
fooey->mutex = NULL;
}
void ObtainControl(foobar* fooey) {
oneAcquire(fooey->mutex);
}
void ReleaseControl(foobar* fooey) {
oneRelease(fooey->mutex);
}
and in the .C file:
foobar fooey;
construct_foobar( &fooey );
ObtainControl( &fooey );
There are actually compilers that compile from C++ to C. The output is not meant for human digestion, though, see How to convert C++ Code to C.
It depends on your compiler because there isn't a standard way of RAII in C. See this question and the top answer.
精彩评论