"inline Methods Hidden" XCode4中的选项。
"inline Methods Hidden" option in XCode4.
请参阅文档信息:隐藏的内联方法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混合在一起,那么。。。它有不同的联系规则,这只会使事情进一步复杂化。
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- Win32编译器选项和内存分配
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 通过选项卡的文本设置QTabWidget顺序
- 通过ccmake在cmake中缓存依赖选项
- 如何传递多个 std::文件系统选项?
- 基于编译器选项的编译二进制路径
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- 如何应用 libcurl 的持久连接选项
- 文件中.dat Dlib 选项
- LLVM | codegen 用于带有命令行选项的程序输入功能
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 按钮悬停在 QT 中垂直布局的选项卡小部件中不起作用
- Visual Studio C++ 它只构建选项卡中显示的文件吗?
- 在C++不适用于猜数字游戏的情况下再次播放选项
- Qt5 用户界面编译器:-i 选项不可用
- CMake - 更改共享库链接选项
- "inline Methods Hidden" XCode4中的选项。