如何隐藏 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++ 头文件中的函数的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 库中隐藏 C 头文件中的函数

C++ 中的头文件和命名空间

C++中的cmath头文件

基本 C++ 头文件问题

如何使用 Qt Creator 将 C++ 头文件添加到 Qt 项目

C++中CTime的头文件