在函数实现中使用命名空间

时间:2011-01-27 00:01:52

标签: c++ namespaces

在C ++中,我可以在函数实现文件中使用using namespace std;声明吗?

4 个答案:

答案 0 :(得分:88)

也许您也想知道您可以将using namespace std;放在函数体中,如下所示。这将限制using namespace语句的范围。

void f() {
  using namespace std;
  cout << "Foo" << endl;
  //..
};

void g() {
  cout << "Bar" << endl; //ERROR: cout and endl are not declared in this scope.
};

如果你想在一个用头文件写的函数体中使用命名空间的很多元素,这很有用(你本身不应该这样,但有时它是好的,甚至几乎是必要的(例如模板))。

答案 1 :(得分:12)

“功能实现文件”是指.h文件还是.cpp文件? (我通常会将.cpp文件称为“实现”文件,而.h文件则是“接口”文件。)

如果你的意思是.cpp文件,那么当然。这是您通常看到using namespace std的地方。这意味着此.cpp文件中的所有代码都可以无限制地访问std

如果您的意思是.h文件,那么您可以,但您不应该。如果将它包含在.h文件中,它将自动应用于包含.h文件的任何.cpp文件,该文件可能是很多文件。您通常不希望告诉其他模块要导入哪些名称空间。最好将它放在每个.cpp文件中,而不是放在一个普通的.h文件中。

答案 2 :(得分:7)

我假设你的意思是这样的:

// Foo.h

void SayHello();

...

// Foo.cpp

#include "Foo.h"

using namespace std;

void SayHello()
{
    cout << "Hello, world!" << endl;
}

如果是这样,那么是的。但是,在较大的项目中使用using namespace std;被认为是不好的做法。

答案 3 :(得分:4)

如果通过“函数实现文件”表示.C / .cpp等文件,则可以尝试避免。而只是注入您需要的内容,例如,如果<iostream>std::cout需要std::endl等,只需将这两个注入using std::cout;using std::endl;,现在您只需撰写coutendl