首先,同样的原型的两个函数在连个不同的c文件中都有定义,把这两个c文件编译、连接在一起,也没有什么错误。原因就是因为,gcc中有一个strong symbol和weak symbol的概念。默认函数定义都是strong symbol的,两个相同的strong symbol连接在一起,肯定会产生”symbol重复定义”的错误。
但是,这里我们将weak_symbol.c中的common_print加了weak属性,这样gcc再选择的时候优先选择strong symbol
2) 其次,根据例子程序执行的结果来看,执行了strong_symbol.c中的common_print函数。如果我们在strong_symbol.c中不提供common_print函数的实现,那么调用的就是weak_symbol.c中的实现。
3) 由上,我们可以想象,当要用c语音提供一个api库的时候,我们可以把这些api都声明为weak属性的,作为一个default实现。当用户想要自己定制的时候,也就很容易实现了。glibc中的很多api就是这样设计的。
原文地址:https://www.cnblogs.com/litifeng/p/8450146.html
时间: 2024-10-16 10:09:08