【问题标题】:no std namespace没有标准命名空间
【发布时间】:2009-12-20 15:54:57
【问题描述】:

我们有一个合理大小的 C++ 应用程序,在这个阶段已经相当老了,所以它有一些怪癖。

其中一个怪癖在于它如何处理使用预标准化标准库的 C++ 编译器。有一个头文件应该解决标准兼容编译器和这个不兼容编译器之间的任何差异。由于各种原因,我们不能/不想停止支持这个编译器。

#include <vector>
#include <set>
#if defined(NO_STD_LIB)
    #include <iostream.h>
#else
    #incude <iostream>

    using std::string;
    using std::cout;
    using std::vector;
    using std::cout;
#endif

你按如下方式使用它

#include stl.h
int main() {
    vector<string> foo;
    .....
    return 0;
}

这种方法有两个主要问题:

  1. 每个包含 std.h 的编译单元都必须编译大量不需要的代码(我们正在努力尽可能减少编译时间)
  2. 全局命名空间几乎被通常在 std 命名空间中的所有内容所污染。

我真的很想在代码清理项目中解决这两个问题。第一个确实是这样做的更重要原因。

由于我们必须支持这个旧编译器,因此我们的代码将始终必须避免名称与其在标准库中公开的内容发生冲突,因此第 2 点并不真正相关,尽管我希望看到一个解决方案当/如果我们最终可以放弃对它的支持时工作。

到目前为止,我的想法是将超级标题分解为一组较小的标题。例如stl_vector、stl_iostream、stl_set 等。这样我们只能包含我们感兴趣的标准库的部分。这些文件名遵循 std 头的模式,但具有易于搜索的前缀。因此,当需要转储有问题的编译器时,搜索前缀并将其删除会很简单。

我认为这将很容易解决问题 1。

我真正的问题是解决问题 2。我想做这样的事情

#if defined(NO_STD_LIB)
    #include <iostream.h>
    #define std
#else
    #include <iostream>

那么我们可以编写如下代码:

#incude "stl_iostream"

int main() {
  std::string foo("bar");
  std::cout << foo << std::endl;
}

这几乎奏效了。在没有标准命名空间的地方,#define std 使 std::string 分解为 ::string 并且生活很好。

然后我尝试了一个 .cc 文件,该文件使用了可怕的“使用命名空间 std;”我得到一个编译错误,因为它变成了“使用命名空间”,所以这显然行不通。

现在显然我可以禁止人们编写“使用命名空间 std;”,但在标题中应该尽可能避免它,它有时在您大量使用大量 STL 类的 .cc 文件中很有用。

所以,最后,这个问题。是否有处理此问题的标准习语。或者如果没有标准的方法来处理这个问题,那么您使用什么技巧来支持使用预标准标准库的编译器。

我曾考虑使用预编译的头文件来解决编译速度问题,但我们针对不同的编译器,并且努力让它在所有这些编译器上工作可能意味着不值得我们花时间去做。

建议我放弃不符合标准的编译器的答案可能很受欢迎,但不会被接受,因为这是我们现在不能做的事情。

【问题讨论】:

    标签: c++ compiler-construction namespaces std


    【解决方案1】:

    你可以试试:

    #if defined(NO_STD_LIB)
    namespace std {
        using ::string;
        using ::cout;
        using ::vector;
        using ::cout;
    }
    #endif
    

    那么std::string 就可以了。

    如果语言中存在using namespace ::; 指令会更好;但事实并非如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2023-03-26
      • 2013-02-08
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多