弱连接的便携性如何? #pragma weak my_symbol

时间:2009-09-11 13:17:59

标签: c gcc linker portability weak-linking

弱连接的可移植性如何?

#pragma weak my_symbol

我看到了这个问题:how-to-make-weak-linking-work-with-gcc讨论了如何让它发挥作用。但有没有一个很好的方法来做到这一点,不需要gcc?

弱链接和用#ifdef保护声明有什么区别?

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

1 个答案:

答案 0 :(得分:13)

根据定义,

#pragma 可移植。

弱链接在链接时完成(令人惊讶的是)。它允许具有相同签名的函数(或任何符号,实际上)覆盖另一个。这意味着将选择一个强者而不是弱者,但如果没有强者,将使用弱者。

包含防护是由编译器完成的,而不是链接器,并且如果强者不在那里,他们允许回退到弱者。如果您控制两个函数的源,您可以模拟相同的行为(通过ifdef - 为一个,ifndef为另一个,但情况并非总是如此,这是两个选择之间的更多选择功能强大。

弱链接允许您执行诸如放入自己的malloc()/free()以进行调试之类的操作,同时仍然链接到提供它们的库。