【问题标题】: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++ 标准库头文件一样。

    不幸的是,当包含&lt;cmath&gt; 时,C++ 标准确实允许编译器/标准库实现将名称放在全局命名空间中。所以即使你使用这个变体,你也不能保证它不会污染全局命名空间,我认为大多数实现确实如此。


    不幸的是,您不得不忍受 C 标准库函数,这些函数被继承到 C++ 中,污染了全局命名空间。我不认为有什么可以做的。

    你可以做的就是把你自己程序的所有声明放到一个命名空间中,例如:

    namespace my_stuff {
        // ...
    }
    

    如果存在名称冲突,那么在大多数情况下,只要您留在命名空间中,就会选择您自己的名称而不是全局名称。

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2011-05-14
      • 2015-03-05
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2019-07-22
      • 1970-01-01
      相关资源
      最近更新 更多