LINUX.ORG.RU

[C++]указатель на статический метод класса


0

2

Допустим, есть библиотека на C. Ей передается указатель на функцию, для реализации callback. Есть программа на С++, которая пользуется данной библиотекой. Можно ли скастануть указатель на статический метод класса с тем же набором аргументов, что и callback-функция и передать его в библиотеку, при этом еще быть уверенным, что данное действие будет портируемым между разными системами/компиляторами? Или лучше сделать функцию-обертку и уже из нее дергать методы нужных классов?

★★★★★

Даже кастовать толком ничего не придется

yoghurt ★★★★★ ()

можно, но:

лучше сделать функцию-обертку и уже из нее дергать методы нужных классов

shty ★★★★★ ()

Да, можно.

P.S. Лучше не сидеть, а писать код и решать подобные мелочи по мере накопления. Можно протестировать если очень важно с GCC, MSVS, ICC, Solaris Studio, Clang. Остальные пользователи - ССЗБ и не нужны. Как и линуксоиды для большинства десктопного софта.

vertexua ★★★★★ ()
Ответ на: комментарий от shty

лучше сделать функцию-обертку и уже из нее дергать методы нужных классов

Так обычно статические методы, передаваемые в виде коллбеков, и являются такими обертками над обычными методами.

yoghurt ★★★★★ ()

Можно ли ... быть уверенным, что данное действие будет портируемым между разными системами/компиляторами?

Нет, нельзя.

Или лучше сделать функцию-обертку

Делая функцию, не забудь определить её как:

extern "C"

LamerOk ★★★★★ ()
Ответ на: комментарий от LamerOk

Делая функцию, не забудь определить её как:

extern «C»

смысл? Она же не экспортируется из динамической библиотеки по имени, а просто передается указатель на нее в другую функцию

Harald ★★★★★ ()
Ответ на: комментарий от LamerOk

Можно ли ... быть уверенным, что данное действие будет портируемым между разными системами/компиляторами?

Нет, нельзя.

Классный ник.

ISO/IEC 14882:2011:

A static member function (9.4) is an ordinary function.

Pavval ★★★★★ ()

Если метод статический, то он не отличается от обычной функции. Сам реализовывал так коллбеки.

DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от DELIRIUM

Да. Теперь ниже должна быть лекция про указатель динамический и толк в извращениях :)

slackwarrior ★★★★★ ()
Ответ на: комментарий от Harald

смысл? Она же не экспортируется из динамической библиотеки

Это только уменьшает объём доступной информации.

ABI помимо прочего определяет соглашение о вызове - двоичный код передачи параметров, возвращаемого значения, вызова самой функции и возврата из неё.

Если для динамической линковки оно задано целевой платформой, и реализации C/C++ как правило предоставляют механизм такого вызова, то для обратных вызовов нет даже этого. Формально каждая реализация С/С++ может использовать свое собственное соглашение о вызовах, которое не обязано быть совместимым ни с чем и ни с кем.

Соответствено, если библиотека (хоть динамическая, хоть статическая) собрана одним компилятором, а твой код - другим, нет никакого способа гарантировать, что для обратных вызовов будет использовано одно и то же соглашение о вызовах. Даже включение заголовочного файла с прототипом обратного вызова не может этого обеспечить.

Всё, что можешь сделать ты в рамках стандарта C++, это явно задать спецификатор компоновки через extern «C», в надежде, что компилятор, которым будут собирать твою программу, использует в этом случае такое же соглашение о вызовах, что и двоичный код библиотеки.

LamerOk ★★★★★ ()
Ответ на: комментарий от Pavval

A static member function (9.4) is an ordinary function.

Твоё домашнее задание на сегодня:

1. Собрать в интернете информацию об calling convention.
2. Выписать из стандартов ISO/IEC 9899:1999 и ISO/IEC 14882:2011 все упоминания о calling convention.
3. Подготовить доклад обо всех широко распространённых соглашениях вызовов и их взаимоотношениях со стандартами языков C/C++.

LamerOk ★★★★★ ()
Ответ на: комментарий от LamerOk

И что тебе мешает задать cconv для static ф-ции? А тебе дз - найти платформу и связку компиляторов C/C++ для нее, у которых разные дефолтные cconv.

Pavval ★★★★★ ()
Ответ на: комментарий от Pavval

Почему не сделал домашку? Садись, два.

что тебе мешает задать cconv для static ф-ции?

Для всех компиляторов подо все платформы? Надо было делать домашнее задание, тогда бы знал.

найти платформу и связку компиляторов C/C++ для нее, у которых разные дефолтные cconv.

Одно очень редкое семейство операционных систем Windows 95/98/ME/NT 3.x/NT 4.x/2k/XP/Vista/7/2008 на экзотической платформе Intel x86 и комилятор под неё от одного и того же производителя используют разные соглашения о вызовах. Компилятор Watcom использует собственное соглашения о вызовах для всех целевых платформ, так же как и IBM VisualAge for C/C++.

LamerOk ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.