gpt4 book ai didi

c++ - 没有 std 命名空间

转载 作者:太空狗 更新时间:2023-10-29 23:26:05 28 4
gpt4 key购买 nike

我们有一个大小适中的 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 点并不真正相关,但我希望看到一个解决方案当/如果我们最终可以放弃对它的支持时工作。

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

我认为这将很容易解决问题 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;
}

这几乎奏效了。在没有标准 namespace 的情况下,#define std 使 std::string 分解为::string 并且生活很好。

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

现在显然我可以禁止人们编写“using namespace std;”,但尽管在 header 中应该避免这种情况,但它有时在大量使用大量 STL 类的 .cc 文件中很有用。

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

我曾考虑过使用预编译头文件来解决编译速度问题,但我们针对不同的编译器,要让所有这些编译器都能正常工作可能意味着不值得我们花时间去做这件事。

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

最佳答案

你可以试试:

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

然后 std::string 将起作用。

如果语言中存在 using namespace::; 指令会好得多;然而事实并非如此。

关于c++ - 没有 std 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1936184/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com