Domanda

Ho un static inline Funzione definita in un file H e ad un certo punto in un file C, sto assegnando un puntatore alla funzione, qualcosa del genere:

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();

Quindi penso che ciò che accadrà qui sia che il compilatore in linea frobnicate da bar.c, ma in foo.c, dovrà effettivamente creare una funzione per implementare frobnicate, in modo che possa avere un puntatore funzionante ad esso.

Qualcuno può confermare se la mia comprensione è accurata e correggermi altrimenti?

È stato utile?

Soluzione

inline è uno dei confini dello standard C. Il suo significato principale è essere in grado di mettere la definizione di una funzione in un file di intestazione senza dover affrontare problemi di "definizione multipla" al momento del collegamento.

Il modo ufficiale in C99 e C11 per fare ciò che vuoi ottenere è avere il inline Definizione nel file di intestazione, senza static. Dal momento che è necessario emettere anche il simbolo, è necessario dire al compilatore in quale unità di compilazione dovrebbe essere. Tale istanza può essere eseguita da un dichiarazione in quel file .c in cui ometti il inline parola chiave.

Più naturalmente potresti usare il file .c in cui hai effettivamente bisogno del simbolo.

Altri suggerimenti

Si hai ragione. Quando si porta il puntatore alla funzione, il compilatore deve creare una versione "autonoma" in cui il codice può essere chiamato come funzione normale.

Il vantaggio di installare una funzione è che il codice chiamata non deve essere creato e qualsiasi altra ottimizzazione può essere applicata per integrare sia la funzione chiamante che la funzione inlineata. Ma quando è necessario effettuare una chiamata regolare alla funzione (come quando si prende l'indirizzo per chiamarlo ultimo), tali ottimizzazioni non sono più possibili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top