C: указатель на встроенную функцию - PullRequest
11 голосов
/ 17 января 2012

У меня есть функция 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, чтобы иметь рабочий указатель на нее.

Может кто-нибудь подтвердить, что мое пониманиеточный, и поправьте меня иначе?

Ответы [ 2 ]

10 голосов
/ 17 января 2012

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

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

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

7 голосов
/ 17 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...