如何在 C++ header 文件中隐藏函数
How to hide functions in C++ header files
我正在用 C++ 编写 header-only 模板库。我希望能够在 header 文件中编写一些辅助函数,这些函数在包含此 header 库的 cpp 文件中是不可见的。
有关如何执行此操作的任何提示?
我知道可以在 cpp 文件中使用 static 关键字来限制对那个翻译单元的可见性。 header 个文件有类似的东西吗?
真的没有办法。
惯例是为不属于 public 的定义使用命名空间。此命名空间的典型名称是 details
,表示实现细节,或 internal
,表示您的库内部。
并且如评论中所述,C++20 模块改变了这种情况。
简单的答案是否定的。
Headers 对链接器不存在,因此 header 中的所有函数实际上都在包含它们的模块中。 header 中的技术静态(或匿名命名空间)函数对于包含它们的模块是静态的。这可能有效,但你最终会得到多个函数,并且臃肿 code-sizes.
因此,您应该始终在 header 文件中内联函数,或使用暗示内联的内容 - 如 constexpr;如果可能...
header 中的函数通常依赖于内联或模板化。模板化函数是“弱”的,这意味着链接器假定它们都是相同的,并且只使用随机的一个,并丢弃其他的。
我正在用 C++ 编写 header-only 模板库。我希望能够在 header 文件中编写一些辅助函数,这些函数在包含此 header 库的 cpp 文件中是不可见的。 有关如何执行此操作的任何提示?
我知道可以在 cpp 文件中使用 static 关键字来限制对那个翻译单元的可见性。 header 个文件有类似的东西吗?
真的没有办法。
惯例是为不属于 public 的定义使用命名空间。此命名空间的典型名称是 details
,表示实现细节,或 internal
,表示您的库内部。
并且如评论中所述,C++20 模块改变了这种情况。
简单的答案是否定的。
Headers 对链接器不存在,因此 header 中的所有函数实际上都在包含它们的模块中。 header 中的技术静态(或匿名命名空间)函数对于包含它们的模块是静态的。这可能有效,但你最终会得到多个函数,并且臃肿 code-sizes.
因此,您应该始终在 header 文件中内联函数,或使用暗示内联的内容 - 如 constexpr;如果可能...
header 中的函数通常依赖于内联或模板化。模板化函数是“弱”的,这意味着链接器假定它们都是相同的,并且只使用随机的一个,并丢弃其他的。