2009-09-11 36 views
2

Comment portable est la liaison faible?Comment portable est la liaison faible? #pragma faible my_symbol

#pragma weak my_symbol 

Je vois cette question: how-to-make-weak-linking-work-with-gcc explique comment le faire fonctionner. Mais y a-t-il un bon moyen de le faire de telle sorte que gcc ne soit pas nécessaire?

Quelle est la différence entre une liaison faible et la sauvegarde de la déclaration avec un #ifdef?

#ifndef my_weak_fn 
    void my_weak_fn(){/* Do nothing */ return;} 
#endif 

Répondre

12

#pragma est, par définition, pas portable.

Et une liaison faible est effectuée au moment de la liaison (de manière surprenante). Il permet à une fonction (ou à un symbole, en réalité) avec la même signature de surcharger une autre. Cela signifie qu'un fort sera choisi de préférence au faible mais, s'il n'y en a pas un fort, le faible sera utilisé.

Inclure les gardes sont faites par le compilateur, pas l'éditeur de liens, et ils font pas permettre le repli à un faible si le fort n'est pas là. Vous pouvez simuler le même comportement si vous contrôlez la source pour les deux fonctions (par ifdef -d'un, ifndef -d'autres) mais ce n'est pas toujours le cas et c'est plus choisir entre deux fonctions fortes.

La liaison faible vous permet de faire des choses comme déposer votre propre malloc()/free() à des fins de débogage tout en continuant de lier la bibliothèque qui les fournit.