Как я могу заставить пользователя предоставлять свою собственную функцию в моей библиотеке? - PullRequest
2 голосов
/ 10 февраля 2011

Я пишу статическую библиотеку для AVR MCU.Я использую AVR-GCC и AVR Libc.Некоторые функции библиотеки используют SPI для связи с устройством.Однако обмен данными SPI не выполняется одинаково на всех микроконтроллерах AVR (не все из них имеют одинаковые соответствующие регистры).Это может быть сделано даже большим ударом.Таким образом, я хочу, чтобы пользователь предоставил свою собственную процедуру SPI для своего конкретного приложения.

Как я могу это сделать?Должны ли все библиотечные функции принимать функцию обратного вызова в качестве дополнительного аргумента?Должен ли я иметь глобальную переменную в библиотеке, выступающей в качестве обработчика SPI?Должен ли я сделать функцию внешней (используя extern)?

Спасибо,

1 Ответ

4 голосов
/ 10 февраля 2011

Простое и понятное решение - просто объявить функцию extern с соответствующим именем. Это позволяет вам скомпилировать вашу библиотеку без функции extern, которая еще не существует. Но ни вы, ни ваши пользователи не смогут связать полный исполняемый файл без предоставления соответствующей функции.

Я сам использовал этот подход и рекомендую его. Это позволяет избежать ненужных сложностей, не использует ничего, что не является абсолютно фундаментальным для всех сред программирования на C, и, что важно, очевидные ошибки будут отмечены во время сборки, а не во время выполнения (вы не получите сбоев во время выполнения, поскольку вызываются неопределенные функции обратного вызова). 1003 *

...