Как я могу реализовать функцию, которая указана с предложением «extern» в заголовке C, в классе C ?

#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 ?