如果您已经包含 using namespace std,为什么不必包含 <vector>
看看这个网址: https ://en.cppreference.com/w/cpp/header
有 100 多个头文件可供您使用。
恕我直言,您遇到的困惑是,这些相同的 100 多个标头也可供标头作者使用,并且他们还可以访问通常未在标准中发布的标头。结果是,例如,当您或我包含 <stringstream> 时,包含的某些间接部分也可能“拉入”<string>。
我建议您不要在代码中添加“使用命名空间标准”。它的使用并没有故意导致 <vector> 的“隐藏/间接”包含,并且可能不会在下一个实现中。
我在 g++v7.3 上。我很快就会升级到当前的 g++(我认为是 9.x?)除非您明确包含它,否则您不能依赖包含它。
这对我有用,但我想了解为什么这个有效而另一个无效。
只是运气......我认为不好,如果你因为它开始了多个坏习惯。
如果你的编译器支持 -std=c++17 或更好,它有一个我喜欢的新特性。新功能允许我在包含头文件之后立即指定该库中我特别需要的函数。它看起来像这样:
#include <iostream>
using std::cout, std::cerr, std::endl, std::flush,
std::hex, std::dec, std::cin;
#include <iomanip>
using std::setw, std::setfill;
#include <string>
using std::string, std::to_string;
#include <thread>
using std::thread, std::this_thread::sleep_for;
#include <vector>
using std::vector;
您自己的库可以类似地处理:
#ifndef DTB_ENG_FORMAT_HH
#include "../../bag/src/dtb_eng_format.hh"
using DTB::EngFormat_t;
#endif
#ifndef DTB_PPLSEM_HH
#include "../../bag/src/dtb_pplsem.hh"
using DTB::PPLSem_t;
#endif
#ifndef DTB_ENG_FORMAT_HH
#include "../../bag/src/dtb_eng_format.hh"
#endif
#ifndef DTB_ASSERT_HH
#include "../../bag/src/dtb_assert.hh"
#endif
我尝试跟踪其中的一小部分,并将它们收集到一个文件中。当我开始一项新工作时,我会使用更大的列表,并简单地删除“未使用”的功能(当我想发布我的工作时)。