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
È stato utile?

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.

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