Pergunta

Quão portátil está fraco vinculando?

#pragma weak my_symbol

Eu vejo essa pergunta: Como fazer o que fazer-se-link-with-gcc discute como fazê -lo funcionar. Mas existe uma boa maneira de fazer isso de modo que o GCC não seja necessário?

Qual é a diferença entre vincular e proteger a declaração com um #IFDEF?

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

Solução

#pragma é, por definição, não portátil.

E a ligação fraca é feita na hora do link (surpreendentemente). Ele permite uma função (ou qualquer símbolo, na verdade) com a mesma assinatura para substituir outra. Isso significa que um forte será escolhido em preferência ao fraco, mas, se não houver um forte, o fraco será usado.

Incluem guardas são feitos pelo compilador, não pelo vinculador, e eles fazem não Deixe o fallback a um fraco se o forte não estiver lá. Você pode simular o mesmo comportamento se controlar a fonte das duas funções (por ifdef-ing para um, ifndef-ing para o outro), mas esse nem sempre é o caso e isso é mais uma escolha entre duas funções fortes.

A ligação fraca permite que você faça coisas como cair no seu próprio malloc()/free() Para fins de depuração, enquanto ainda vincula à biblioteca que os fornece.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top