Pregunta

¿Qué tan portátil es el enlace débil?

#pragma weak my_symbol

Veo esa pregunta: how-to-make-weak- link-work-with-gcc explica cómo hacer que funcione. Pero, ¿hay una buena manera de hacer esto de modo que no se requiera gcc?

¿Cuál es la diferencia entre un enlace débil y la protección de la declaración con un #ifdef?

#ifndef my_weak_fn
    void my_weak_fn(){/* Do nothing */ return;}
#endif
¿Fue útil?

Solución

#pragma es, por definición, no portátil.

Y el enlace débil se realiza en el momento del enlace (sorprendentemente). Permite que una función (o cualquier símbolo, realmente) con la misma firma anule a otra. Eso significa que se elegirá uno fuerte con preferencia al débil pero, si no hay uno fuerte, se usará el débil.

Las compilaciones de inclusión las realiza el compilador, no el enlazador, y no permiten el retroceso a uno débil si el fuerte no está allí. Puede simular el mismo comportamiento si controla la fuente de ambas funciones (mediante ifdef -ing para una, ifndef -ing para la otra), pero ese no es siempre el caso y esto es más elegir entre dos funciones fuertes.

La vinculación débil le permite hacer cosas como colocar su propio malloc () / free () para propósitos de depuración mientras se vincula con la biblioteca que los proporciona.

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