Использование пространства имен в реализации функции

В С++ можно ли использовать объявление using namespace std; в файлах реализации функции?

Ответ 1

Под "файлами реализации функций" вы подразумеваете файлы .h или .cpp? (Обычно я называю файлы .cpp файлами "реализации", а файлы .h - файлами "интерфейса".)

Если вы имеете в виду .cpp файлы, то конечно. Вот где вы обычно видите using namespace std. Это означает, что весь код в этом файле .cpp имеет доступ к std без квалификации.

Если вы имеете в виду файлы .h, то можете, но не должны. Если вы включите его в файл .h, он будет автоматически применяться к любому файлу .cpp, который содержит файл .h, который может содержать много файлов. Как правило, вы не хотите сообщать другим модулям, какие пространства имен импортировать. Лучше всего поместить его в каждый файл .cpp, а не в обычный файл .h.

Редактировать: Пользователь @lachy предложил редактирование, которое я не буду включать дословно, но они предложили мне указать, что using namespace std обычно считается плохой практикой из-за загрязнения пространства имен. Они дали ссылку на вопрос по этой теме: Почему " использует пространство имен std; " считается плохой практикой?

Ответ 2

Возможно, вам также хотелось бы знать, что вы можете положить 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.
};

Это может быть полезно, если вы хотите использовать множество элементов пространства имен в теле функции, которая написана в заголовочном файле (который вы не должны сами по себе, но иногда это нормально или даже почти необходимо (например, шаблоны)).

Ответ 3

Я предполагаю, что вы имеете в виду что-то вроде этого:

// Foo.h

void SayHello();

...

// Foo.cpp

#include "Foo.h"

using namespace std;

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

Если это так, то да. Тем не менее, он считал, что плохая практика использует using namespace std; в более крупных проектах.

Ответ 4

Если по "файлам реализации функции" вы имеете в виду файлы .C/.cpp и т.д., вы можете, однако, попытаться избежать. Вместо этого вводите только то, что вам нужно, например, если вам нужно <iostream> для std::cout, std::endl и т.д., Просто введите эти два, using std::cout; и using std::endl;, теперь вы можете просто написать cout и endl.