"inline Methods Hidden" XCode4中的选项。

"inline Methods Hidden" option in XCode4.

本文关键字:选项 XCode4 inline Methods Hidden      更新时间:2023-10-16

请参阅文档信息:隐藏的内联方法GCC_INLINES_ARE_PRIVATE_EXTERN=是启用时,内联方法的行外副本被声明为"private extern"。[GCC_INLINES_ARE_PRIVATE_EXTERN,-fvisibility内联隐藏

有人知道它将如何影响正在进行的C++库吗?我的iphone项目是基于C++库的,使用谷歌protobuf,我发现一些奇怪的问题,库内联函数不会被"内联方法隐藏"选项设置为YES触发,事实上这是系统默认值,设置为NO它工作得很好,我不知道为什么?里面的秘密是什么?

任何对这个话题感兴趣的人,请分享和讨论,提前感谢。

秘密是唯一的定义规则。如果内联是隐藏的,那么每个映像可能会有多个(私有(内联副本。

理想情况下,您应该配置和使用所有内容,使其能够使用一个定义规则发挥作用,然后您可以启用私有外部作为优化(这可能在各个方面都不好,尤其是二进制大小(。您会喜欢这种方法,因为它遵循了标准的模型。

快速复习ODR:

// somewhere.hpp
namespace MON {
inline int cas(const int*,const int*,int*) {
    return dah_dum();
}}
// elsewhere.hpp
namespace MON {
inline int cas(const int*,const int*,int*) {
    return dum_dah();
}}

任何不是完全或部分内联的int MON::cas(const int*,const int*,int*)引用,而是对int MON::cas(const int*,const int*,int*)的函数调用,都可能导致使用任何一个定义,而不管哪个定义对TU可见。链接器只保留一个定义并且假设所有定义都相等。这一点很重要,因为如果每个被引用和可见的定义都会为每个翻译产生一个副本,那么二进制大小就会爆炸

如果它在使用ODR规则时"有效",那么很可能您的对象文件中有给定符号的多个定义,并且由于编译器设置,您最终引用了不同的定义。如果您声明的内联不是静态的或在匿名命名空间中,那么所有源文件的定义都应该相同。

如果你把它和C TU混合在一起,那么。。。它有不同的联系规则,这只会使事情进一步复杂化。