#c #static-methods #extern
#c #статические методы #внешний
Вопрос:
Я собираюсь использовать библиотеку драйверов, реализованную на C, в моем проекте, написанном на C . Заголовочный файл библиотеки содержит несколько заглушек функций, объявленных как extern, которые мне нужно будет реализовать:
extern uint8_t ADS1x1x_i2c_start_write (uint8_t i2c_address);
Мой код на C теперь содержит класс с именем vfd
, который будет содержать статические методы, реализующие соответствующие заглушки функций, точно так же, как это:
uint8_t vfd::ADS1x1x_i2c_start_write (uint8_t i2c_address) {
uint8_t ret = 0x00;
// do something
return ret;
}
В заголовочном файле vfd
класса соответствующие строки будут выглядеть следующим образом:
class vfd {
public:
uint8_t ADS1x1x_i2c_start_write (uint8_t i2c_address);
}
Как мне объявить свои методы, чтобы компилятор распознал их как реализации соответствующих extern
функций из заголовка моей библиотеки?
Ответ №1:
Как мне объявить свои методы, чтобы компилятор распознал их как реализации соответствующих внешних функций из заголовка моей библиотеки?
Вы не можете этого сделать. An extern "C"
— это не то же static
самое, что функция-член класса.
Вы можете реализовать extern "C"
функцию таким образом, чтобы она была проходом к static
функции-члену класса.
extern "C" uint8_t ADS1x1x_i2c_start_write (uint8_t i2c_address)
{
return vfd::ADS1x1x_i2c_start_write(i2c_address);
}
Ответ №2:
Ты не можешь. Вы можете реализовать эти функции C в своем файле C отдельно и заставить их вызывать ваши статические функции внутри класса:
extern "C" uint8_t ADS1x1x_i2c_start_write (uint8_t i2c_address) {
vfd::ADS1x1x_i2c_start_write(address);
}
Они статические, верно? В противном случае вам также необходимо предоставить this
объект для вызова метода, а его нигде нет в C API, вам придется разобраться с этим самостоятельно, например:
extern "C" uint8_t ADS1x1x_i2c_start_write (uint8_t i2c_address) {
some_var_of_type_vfd.ADS1x1x_i2c_start_write(address);
}
Комментарии:
1. Должен ли я также ссылаться на эти внешние функции «C» в заголовочном файле
vfd.h
?