宣布" namespace std {}&#34 ;?的目的是什么?

时间:2016-07-23 08:29:46

标签: c++

在某些代码中,我在没有理解确切含义的情况下看到了这个声明......

namespace std {};     // why?
using namespace std;

int main(){

...

}

3 个答案:

答案 0 :(得分:2)

这是命名空间的前向声明。您不得使用'声明之前的命名空间,如果您没有任何包含引入“标准”的任何部分的声明,则必须声明。预先。

这实际上是有用还是必要......这是值得怀疑的。如果你包括任何带来std任何部分的东西,你就不需要前方声明。如果你不是,那么你就不需要using namespace std。所以它可能是一些样板代码 - 被教导的人总是写using namespace std'并写下它,即使它没有任何意义。

答案 1 :(得分:1)

没有意义。我猜这段代码是由一个不知道自己在做什么的人编写的。

无论如何,只要您包含某些内容,您就可以访问命名空间,因此在此声明它并不能真正用于任何目的。

答案 2 :(得分:0)

与上面给出的答案相反,我想展示一种特殊情况,其中向前声明名称空间可能会有用。

我在应用程序中大量使用Boost.Log,在这里我使用namespace lg = boost::log;来缩写诸如boost::log::core::get()->...之类的长语句。别名是在软件的所有组件所包含的常规头文件中声明的,但是我不想在此文件中包含所有Boost.Log,因为并非所有组件都使用日志记录。但是为了定义别名,我需要向前声明boost::log。所以我的头文件包含以下几行:

// boost::log namespace "forward" declaration
namespace boost { namespace log {}}
// Alternatively (from C++17 onwards):
namespace boost::log {}

// Namespace alias for boost::log.
namespace lg = boost::log;

这样,我不需要在每个文件中都定义lg别名,因为这容易出错且乏味(而且我也不需要在全局头文件中包含Boost.Log ,这可能会大大增加构建时间。

如果boost::log并不能告诉您太多信息,请考虑使用诸如std::chrono之类的其他嵌套名称空间。