@CyberRonin

Указатель на функцию или атрибут weak?

Всем доброго времени суток.
В ходе разработки библиотеки на Си столкнулся с дилемой. Для более гибкой настройки я хочу сделать переопределение пользователем некоторых функций. На моем опыте мне доводилось видеть 3 решения : условная компиляция, передача указателя на функцию и атрибут weak. Может ли кто-то указать подводные камни, которые меня ждут при использовании данных способов ?
P.S. Более удобным мне показался вариант с weak
  • Вопрос задан
  • 245 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
Указатель на функцию:
плюсы: явный механизм (требует явных действий пользователя - вызова функции регистрации нового callback), понятней и проще (реализован стандартными средствами языка), универсальней (будет работать на всех платформах и компиляторах), для подключения пользовательского функционала не требуется пересборка библиотеки.
минусы: динамическое связывание - если функция будет активно вызываться, то это может привести к дополнительным накладным расходам.

weak:
плюсы: статическое связывание (отсутствие накладных расходов на вызов)
минусы: требуется не стандартная поддержка компилятора (может не работать при использовании другого компилятора, например у компилятора микрософт другой синтаксис для этого), связывание происходит не явно (компилятор сам выбирает какую функцию использовать из подходящих вариантов), для подключения пользовательского функционала требуется пересборка библиотеки

Условная компиляция:
плюсы: статическое связывание (отсутствие накладных расходов на вызов), универсальность, явный механизм
минусы: возможно немного сложней в реализации, чем weak, для подключения пользовательского функционала требуется пересборка библиотеки

Выводы:
Если требуется статическое связывание, то выбор - условная компиляция. При грамотной реализации тут можно минимизировать действия пользователя по подключению своей реализации функции в сборку библиотеки. Если библиотеку не планируется выпускать в открытый доступ и не смущает не стандартность - можно использовать weak из-за простоты реализации.
В остальных случаях - указатель на функцию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы