Как Вы объявляете экстерна “C” указатель функции

Можно использовать глобальную переменную в других функциях путем объявления этого как global в каждой функции, которая присваивает ему:

globvar = 0

def set_globvar_to_one():
    global globvar    # Needed to modify global copy of globvar
    globvar = 1

def print_globvar():
    print(globvar)     # No need for global declaration to read value of globvar

set_globvar_to_one()
print_globvar()       # Prints 1

я предполагаю, что причина его состоит в том, что, так как глобальные переменные так опасны, Python хочет удостовериться, что Вы действительно знаете, что это - то, с чем Вы играете путем явного требования global ключевое слово.

Видят другие ответы, если Вы хотите совместно использовать глобальную переменную через модули.

10
задан Salgar 8 April 2019 в 10:51
поделиться

2 ответа

Вместо этого вы можете попробовать включить cmath и использовать static_cast (std :: log) (приведение необходимо для разрешения перегрузки double ).

В противном случае вы ограничите свою функцию до extern C функции. Это будет работать как

extern "C" typedef double (*ExtCFuncPtr)(double);

double foo(double num, ExtCFuncPtr func) {
  return 65.4;
}

Другой способ - сделать foo функтором

struct foo {
  typedef double result_type;
  template<typename FuncPtr>
  double operator()(double num, FuncPtr f) const {
    return 65.4;
  }
};

Затем вы можете передать foo () в boost :: bind и поскольку это шаблон, он принимает любые ссылки. Он также будет работать с объектами функций, а не только с указателями функций.

19
ответ дан 3 December 2019 в 17:21
поделиться

Попробуйте использовать typedef:

extern "C" {
  typedef double (*CDoubleFunc)(double);
}

double foo(double num, CDoubleFunc func) {
  return 65.4;
}
4
ответ дан 3 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: