【问题标题】:How to just import one function from C++ headers (aka avoiding namespace pollution)如何只从 C++ 头文件中导入一个函数(又名避免命名空间污染)
【发布时间】:2022-01-11 04:49:50
【问题描述】:
我正在阅读为化学设计 OCR 模型的代码。我看到一些像这样的行
#include <math.h> // fabs(double)
是否可以像 Python 那样只导入一个函数 (from module import function)?
我阅读了 cmath 的代码。当我执行 #include <cmath> 时,内部代码已经执行 #include <math.h> ,因此将所有函数导入到全局命名空间。我该怎么办?
【问题讨论】:
标签:
c++
namespaces
software-design
【解决方案1】:
对于大多数 C++ 标准库头文件,如果您不使用 using namespace std;,它们不会污染全局命名空间,而是将所有内容放入命名空间 std。所以只要你不做using namespace std;就没有污染。
<math.h>
在这方面有点不同。它是 C++ 从 C 继承的标准库头文件之一,因此它不遵循 C++ 标准库的命名空间规则。 C 根本没有命名空间,因此包含标头会将其所有名称放在全局命名空间中。没有办法避免这种情况。在 C 和 C++ 中,无法从标头中选择性包含。
同样的标题还有另一种形式:
#include <cmath>
这个头文件会将所有标准库函数放入 std 命名空间,就像典型的 C++ 标准库头文件一样。
不幸的是,当包含<cmath> 时,C++ 标准确实允许编译器/标准库实现也将名称放在全局命名空间中。所以即使你使用这个变体,你也不能保证它不会污染全局命名空间,我认为大多数实现确实如此。
不幸的是,您不得不忍受 C 标准库函数,这些函数被继承到 C++ 中,污染了全局命名空间。我不认为有什么可以做的。
你可以做的就是把你自己程序的所有声明放到一个命名空间中,例如:
namespace my_stuff {
// ...
}
如果存在名称冲突,那么在大多数情况下,只要您留在命名空间中,就会选择您自己的名称而不是全局名称。