Преобразование класса C ++ в структуру C (и далее) - PullRequest
4 голосов
/ 03 мая 2011

Последние несколько дней я "понижал"> 1000 файлов кода C ++ до C. До сих пор все шло хорошо. Вдруг я лицом к лицу с классом ...

Компилятор первым указал на ошибку в заголовочном файле:

class foobar {
    foo mutex;
public:
    foobar() {
        oneCreate(&mutex, NULL);
    }
    ~foobar() {
        oneDestroy(mutex);
        mutex = NULL;
    }
    void ObtainControl() {
        oneAcquire(mutex);
    }
    void ReleaseControl() {
        oneRelease(mutex);
    }
};

И, конечно, файл C должен воспользоваться этим

foobar fooey;
fooey.ObtainControl();

Я даже не знаю с чего начать .... Помогите?

Ответы [ 4 ]

11 голосов
/ 03 мая 2011

Превратите foobar в обычную структуру

struct foobar {
    goo mutex;
};

Создайте свои собственные "конструктор" и "деструктор" как функции, которые вы вызываете для этой структуры

void InitFoobar(foobar* foo)
{
   oneCreate(&foo->mutex);
}

void FreeFoobar(foobar* foo)
{
   oneDestroy(foo->mutex);
}

struct foobar fooStruct;
InitFoobar(&fooStruct);
// ..
FreeFoobar(&fooStruct);

и т. Д.

4 голосов
/ 03 мая 2011

, поскольку C-Structs не может иметь функции-члены, вы можете создавать указатели на функции или создавать версии этих функций, не являющиеся членами, например:

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);
}

и в файле .C:

foobar fooey;
construct_foobar( &fooey );
ObtainControl( &fooey );
0 голосов
/ 03 мая 2011

Это зависит от вашего компилятора, потому что в C. нет стандартного способа RAII. См. Этот вопрос и ответ сверху .

0 голосов
/ 03 мая 2011

На самом деле есть компиляторы, которые компилируются из C ++ в C. Вывод не предназначен для пищеварения, хотя, смотрите Как преобразовать код C ++ в C .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...