代码之家  ›  专栏  ›  技术社区  ›  Glen

无std名称空间

  •  2
  • Glen  · 技术社区  · 16 年前

    我们有一个合理大小的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点并不是真正相关的,尽管我希望看到一个解决方案,当/如果我们最终能够放弃对它的支持时,它会起作用。

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

    我真正的问题是解决问题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;
    }
    

    现在很明显,我可以禁止人们写“使用名称空间std;”,但是,尽管在头文件中应该避免使用它,但在大量使用STL类的.cc文件中,它有时很有用。

    最后,我要谈谈这个问题。有没有处理这个问题的标准习惯用法。或者,如果没有标准的方法来处理这个问题,那么您会使用什么技巧来支持使用预标准库的编译器呢。

    建议我放弃不一致编译器的答案可能很流行,但不会被接受,因为这是我们现在不能做的事情。

    1 回复  |  直到 16 年前
        1
  •  17
  •   Andreas Bonini    16 年前

    您可以尝试:

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

    然后 std::string

    如果是这样的话,情况会好得多 using namespace ::;