C: puntero a la función en línea
-
29-10-2019 - |
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?
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.