1

Тема: Поєднання C та C++

Є одна ліба на С, в ній використовуються коллбеки. Як краще дістатися с коллбеку, до ресурсів класу у методі якого було створено той коллбек ? Чи не додали в останніх специфікаціях ++ чогось що може це полегшити. Поки що намагаюся оформити коллбек у вигляді лямбди.

2 Востаннє редагувалося koala (17.05.2021 12:20:40)

Re: Поєднання C та C++

Зазвичай колбеки на C передають ще якийсь аргумент, найчастіше void *.
І ні, магії там не буде, якось треба передати this. Наприклад, через той же void *.

Скажімо, сигнатура write_callback у curl виглядає так:

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);

Зверніть увагу на останній аргумент.

3

Re: Поєднання C та C++

Є одна ліба на С, в ній використовуються коллбеки. Як краще дістатися с коллбеку, до ресурсів класу у методі якого було створено той коллбек ?
які такі класи в С?

4

Re: Поєднання C та C++

koala написав:

Зазвичай колбеки на C передають ще якийсь аргумент, найчастіше void *.
І ні, магії там не буде, якось треба передати this. Наприклад, через той же void *.

Скажімо, сигнатура write_callback у curl виглядає так:

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);

Зверніть увагу на останній аргумент.

А якщо прототип коллбеку у лібі не передбачає юзерських даних. То тільки глобальна змінна вказівника на клас, якщо нема можливості переписати прототип коллбеку ?

5 Востаннє редагувалося koala (17.05.2021 13:10:47)

Re: Поєднання C та C++

cheappi386 написав:

А якщо прототип коллбеку у лібі не передбачає юзерських даних. То тільки глобальна змінна вказівника на клас, якщо нема можливості переписати прототип коллбеку ?

Глобальна змінна, статична змінна, синглетон (який знову ж таки на статичній змінній побудований), глобальна змінна вищого порядку (на кшталт Application), що може повернути потрібний об'єкт.
Все, що можна викликати з C. Лямбди та std::function не проходять.

ur_naz написав:

Є одна ліба на С, в ній використовуються коллбеки. Як краще дістатися с коллбеку, до ресурсів класу у методі якого було створено той коллбек ?
які такі класи в С?

Якщо ви не в курсі, що C++ може викликати функції з C, то це чудовий привід підняти свій рівень освіти.

6

Re: Поєднання C та C++

koala написав:
cheappi386 написав:

А якщо прототип коллбеку у лібі не передбачає юзерських даних. То тільки глобальна змінна вказівника на клас, якщо нема можливості переписати прототип коллбеку ?

Глобальна змінна, статична змінна, синглетон (який знову ж таки на статичній змінній побудований), глобальна змінна вищого порядку (на кшталт Application), що може повернути потрібний об'єкт.
Все, що можна викликати з C. Лямбди та std::function не проходять.

Цікаво нащо всілякі наркомани тягнули  до С++ різні фішечки з java та C# , якщо вони там ніколи не будуть повноцінно працювати. Мабуть треба починати вивчати rust...

7

Re: Поєднання C та C++

Я собі на хліб заробляю простими С'ями з WinAPI і мені того досить.

8

Re: Поєднання C та C++

koala написав:

Якщо ви не в курсі, що C++ може викликати функції з C, то це чудовий привід підняти свій рівень освіти.

чув дзвін, та не знав де він...

ще раз питаю: де тот смайл *RTFM*?
бо це якась хвороба:
- у мене отото не працює. тиж програміст, допоможи.
- шо отото?
- допоможи...

9

Re: Поєднання C та C++

Гаразд, розжовую, як для першокурсника: є код на C++. З класами. У певному місці з цього коду треба викликати функцію з бібліотеки на C. З колбеком, тобто з посиланням на певну функцію в коді на C++. В коді на C, звісно, немає жодних класів, там передається лише це посилання. Десь у коді бібліотеки викликається цей колбек - а вже ця функція може використовувати класи, бо вона на C++. Так, колбек мусить мати відповідне погодження виклику та сигнатуру. В результаті - класи в C++, жодних класів в C. В чому ваша проблема? Що незрозуміло?

Подякували: cheappi386, leofun012

10

Re: Поєднання C та C++

по-перше, на об'єктному рівні нема ніяких класів, по-друге, в чому питання? Є функція, що отримує покажчик на іншу функцію?
роби friend функцію і отримуй доступ до членів класа.

11

Re: Поєднання C та C++

Так... терміни "скомпільована бібліотека", "колбек" та "угода про виклики" у вас не викликають жодної реакції?

Подякували: 0xDADA11C7, Arete, leofun013

12

Re: Поєднання C та C++

а повинні?

13

Re: Поєднання C та C++

Загалом так. Знову ж для першокурсника - код ліби недоступний, є лише хедер і скомпільований об'єктний код (.lib чи щось таке).

14

Re: Поєднання C та C++

А навіщо вам код ліби?  rtfm, там все написано

15

Re: Поєднання C та C++

ur_naz написав:

А навіщо вам код ліби?

Це ви пропонували якусь функцію friend-ом оголосити.

ur_naz написав:

rtfm, там все написано

Тоді навіщо форум потрібен?

Подякували: leofun011

16

Re: Поєднання C та C++

ну, точно не для таких речей
от якщо сортувати бауїнів навіть френди не порібні.

17

Re: Поєднання C та C++

Так, конкретно: є, наприклад, бібліотечна функція

void InvokeCallback(void (*callback)(void));

Її змінювати не можна. Вона в певний момент викликає свій параметр.
Завдання: доповнити клас і функції

class MyClass
{
    void start(){/*тут має бути виклик InvokeCallback*/}
    void callback() {/*а оцю функцію треба викликати в результаті роботи InvokeCallback*/}
}

щоб це працювало.

18

Re: Поєднання C та C++

є this? в чому проблема?

19 Востаннє редагувалося koala (17.05.2021 18:00:10)

Re: Поєднання C та C++

Проблема якраз у тому, як достукатися до this.
cheappi386, а можете назвати ту лібу?

20

Re: Поєднання C та C++

Не читав весь тред, бо наспамили вже. А чим таке не підходить?

Прихований текст
extern "C" void invoke_callback(void (*callback)(void)) {
    callback();
}

struct dummy_t {
    void invoke() {
        invoke_callback([] {
            std::cout << "Hello, world!" << std::endl;
        });
    }
};

int main() {
    dummy_t d;
    d.invoke();
}