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

Sea*_*ean 14 c++ namespaces

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

Mik*_*son 94

也许你也想知道你也可以把它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.
};
Run Code Online (Sandbox Code Playgroud)

如果你想在头文件中编写的函数体中使用命名空间的很多元素,这可能很有用(你不应该使用它,但有时候它是正常的,甚至几乎是必要的(例如模板) )).


mgi*_*uca 14

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

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

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

  • @Sean:"main".cpp文件没有特殊规则.关于`main` _function_(只能`int`等)只有一些规则,但这些规则对碰巧在同一文件中定义的其他函数或类没有任何影响. (2认同)

Max*_*xpm 7

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

// Foo.h

void SayHello();
Run Code Online (Sandbox Code Playgroud)

...

// Foo.cpp

#include "Foo.h"

using namespace std;

void SayHello()
{
    cout << "Hello, world!" << endl;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我会尽量避免在实现文件中使用“使用命名空间”,如果以后要使用一个翻译单元,则会出现名称冲突。 (2认同)