Quanto è portatile il collegamento debole? #pragma debole my_symbol
-
05-07-2019 - |
Domanda
Quanto è portatile il collegamento debole?
#pragma weak my_symbol
Vedo questa domanda: how-to-make-weak- linking-work-with-gcc discute come farlo funzionare. Ma c'è un buon modo per farlo in modo che gcc non sia richiesto?
Qual è la differenza tra collegamento debole e protezione della dichiarazione con un #ifdef?
#ifndef my_weak_fn
void my_weak_fn(){/* Do nothing */ return;}
#endif
Soluzione
#pragma
è, per definizione, non portatile.
E il collegamento debole viene eseguito al momento del collegamento (abbastanza sorprendentemente). Consente a una funzione (o qualsiasi simbolo, in realtà) con la stessa firma di sovrascriverne un'altra. Ciò significa che uno forte verrà scelto in preferenza a quello debole ma, se non ce n'è uno forte, verrà utilizzato quello debole.
Le protezioni di inclusione vengono eseguite dal compilatore, non dal linker, e non consente il fallback se il forte non è presente. Puoi simulare lo stesso comportamento se controlli l'origine per entrambe le funzioni (mediante ifdef
-ing per uno, ifndef
-ing per l'altro) ma non è sempre il caso e questo è più scegliere tra due funzioni forti.
I collegamenti deboli ti permettono di fare cose come inserire il tuo malloc () / free ()
per scopi di debug mentre ti colleghi ancora alla libreria che li fornisce.