Подтвердить что ты не робот

C: указатель на встроенную функцию

У меня есть функция static inline, определенная в файле H, и в какой-то момент в файле C я назначаю указатель на функцию, что-то вроде этого:

foo.h:

static inline void frobnicate(void) {
    // frobs something.
}

foo.c

#include "foo.h"

void execute(void (*func)(void) ) {
    func();
}

void blahBlahBlah(void) {
    execute(frobnicate);
}

bar.c

#include "foo.h"
// ...
frobnicate();

Итак, я думаю, что здесь произойдет то, что компилятор выполнит вызов frobnicate из bar.c, но в foo.c ему действительно нужно создать функцию для реализации frobnicate, чтобы она может иметь рабочий указатель на него.

Может ли кто-нибудь подтвердить правильность моего понимания и исправить меня в противном случае?

4b9b3361

Ответ 1

inline является одним из неправильных значений стандарта C. Его основное значение заключается в том, чтобы уметь определять функцию в заголовочном файле без необходимости иметь дело с проблемами "множественного определения" во время соединения.

Официальный способ в C99 и C11 делать то, что вы хотите достичь, - это определение inline в файле заголовка без static. Так как вам также нужен символ, который должен быть испущен, вам нужно сообщить компилятору, в каком компиляторе это должно быть. Такое создание может быть сделано с помощью объявления в этом .c файле, где вы опускаете ключевое слово inline.

Естественно, вы могли бы использовать файл .c, где вам действительно нужен символ.

Ответ 2

Да, вы правы. Когда вы берете указатель на функцию, компилятор должен создать "автономную" версию, где код может быть вызван как нормальная функция.

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