Pregunta

tengo un static inline función definida en un archivo H, y en un punto en un archivo C, estoy asignando un puntero a la función, algo como esto:

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

Así que creo que lo que sucederá aquí es que el compilador en línea la llamada a frobnicate de bar.c, pero en foo.c, en realidad tendrá que crear una función para implementar frobnicate, para que pueda tener un puntero de trabajo.

¿Alguien puede confirmar si mi comprensión es precisa y me corrige lo contrario?

¿Fue útil?

Solución

inline es uno de los nombres inapropiados del estándar C. Su principal significado es poder poner la definición de una función en un archivo de encabezado sin tener que lidiar con los problemas de "definición múltiple" en el momento del enlace.

La forma oficial en C99 y C11 para hacer lo que desea lograr es tener el inline Definición en el archivo de encabezado, sin el static. Como también necesita que se emita el símbolo, debe decirle al compilador en qué unidad de compilación debería ser. Tal instanciación se puede hacer con un declaración en ese archivo .c donde omite el inline palabra clave.

Lo más naturalmente puede usar el archivo .c donde realmente necesita el símbolo.

Otros consejos

Sí, tiene usted razón. Cuando lleva el puntero a la función, el compilador debe crear una versión "independiente" donde el código se puede llamar como una función normal.

El beneficio de insertar una función es que el código de llamada no necesita ser creado y cualquier otra optimización puede aplicarse para integrar tanto la función de llamadas como la función en línea. Pero cuando necesita hacer una llamada regular a la función (como cuando toma la dirección para llamarla última), esas optimizaciones ya no son posibles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top