如何隐藏 C++ 头文件中的函数
Posted
技术标签:
【中文标题】如何隐藏 C++ 头文件中的函数【英文标题】:How to hide functions in C++ header files 【发布时间】:2022-01-09 01:52:09 【问题描述】:我正在用 C++ 编写一个仅包含标头的模板库。我希望能够在该头文件中编写一些辅助函数,这些函数在包含该头库的 cpp 文件中是不可见的。 有关如何执行此操作的任何提示?
我知道可以在 cpp 文件中使用 static 关键字来限制对该翻译单元的可见性。头文件有类似的东西吗?
【问题讨论】:
您可能会使用额外的内部命名空间。 (但仍然可见)。 从 C++20 开始,使用模块,您可以选择导出的内容。 应该提到,访问修饰符和作用域并不是很好的代码安全性——你必须假设用户将使用未记录的 API,如果他们确定的话,并且尽可能使用明确命名的内部命名空间进行通信。 【参考方案1】:真的没有办法。
约定是为不公开的定义使用命名空间。此命名空间的典型名称为 details
,表示实现细节,或 internal
,表示库内部。
正如 cmets 中提到的,C++20 模块改变了这种情况。
【讨论】:
你的回答比我的好:-)【参考方案2】:简单的答案是否定的。 链接器不存在标头,因此标头中的所有函数实际上都在包含它们的模块中。从技术上讲,标头中的静态(或匿名命名空间)函数对于包含它们的模块来说是静态的。这可能行得通,但您最终会得到多个函数和臃肿的代码大小。
因此,您应该始终在头文件中内联函数,或者使用暗示内联的东西——比如 constexpr;如果可能的话... 标头中的函数通常依赖于内联或模板化。模板化函数是“弱”的,这意味着链接器假定它们都是相同的,只是使用一个随机函数,而丢弃其他函数。
【讨论】:
以上是关于如何隐藏 C++ 头文件中的函数的主要内容,如果未能解决你的问题,请参考以下文章