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
, чтобы она может иметь рабочий указатель на него.
Может ли кто-нибудь подтвердить правильность моего понимания и исправить меня в противном случае?
Ответы
Ответ 1
inline
является одним из неправильных значений стандарта C. Его основное значение заключается в том, чтобы уметь определять функцию в заголовочном файле без необходимости иметь дело с проблемами "множественного определения" во время соединения.
Официальный способ в C99 и C11 делать то, что вы хотите достичь, - это определение inline
в файле заголовка без static
. Так как вам также нужен символ, который должен быть испущен, вам нужно сообщить компилятору, в каком компиляторе это должно быть. Такое создание может быть сделано с помощью объявления в этом .c файле, где вы опускаете ключевое слово inline
.
Естественно, вы могли бы использовать файл .c, где вам действительно нужен символ.
Ответ 2
Да, вы правы. Когда вы берете указатель на функцию, компилятор должен создать "автономную" версию, где код может быть вызван как нормальная функция.
Преимущество встраивания функции в том, что вызывающий код не нужно создавать, и любая другая оптимизация может быть использована для интеграции как функции вызывающего абонента, так и встроенной функции. Но когда вам нужно выполнить регулярный вызов функции (например, когда вы берете адрес для вызова последнего), эти оптимизации больше не возможны.