Как использовать единое пространство имен между файлами? - PullRequest
3 голосов
/ 23 июня 2009

У меня есть проект C ++ (VC ++ 2008), который использует пространство имен std только во многих исходных файлах, но я не могу найти «правильное» место для «использования пространства имен std;».

Если я помещу его в main.cpp, он не распространяется на другие мои исходные файлы. У меня это работало, когда я помещал это в заголовочный файл, но с тех пор мне сказали, что это плохо. Если я добавлю его во все мои файлы .cpp, компилятор не распознает пространство имен std.

Как это сделать?

Ответы [ 6 ]

2 голосов
/ 23 июня 2009

Обычно у вас есть три варианта:

  1. Использование области (std :: Something)
  2. Поместить с помощью вверху исходного файла
  3. Поместить в общий заголовочный файл

Я думаю, что наиболее распространенная лучшая практика - использовать # 1 - показать, откуда именно этот метод.

В некоторых случаях файл настолько полностью зависит от извлечения содержимого из пространства имен, что становится удобнее читать размещаемое пространство имен в верхней части исходного файла. Хотя это легко сделать из-за лени, постарайтесь не поддаться этому искушению. По крайней мере, благодаря тому, что он находится внутри определенных исходных файлов, он виден кому-то, кто поддерживает код.

Третий случай, как правило, плохая практика. Это может привести к проблемам, если вы зависите от нескольких внешних исходных файлов, которые могут определять один и тот же метод. Кроме того, для тех, кто поддерживает ваш код, он скрывает, откуда поступают определенные объявления. Этого следует избегать.

Резюме: Предпочитайте использовать экземпляры с областью видимости (std :: Something), если их чрезмерное использование не снижает удобочитаемость и удобство обслуживания вашего кода.

2 голосов
/ 23 июня 2009

В ваших заголовках лучшее, что я думаю, это просто определить пространство имен, скажем, члена

#include <list>

class CYourClass
{
    std::list<int> myListOfInts;
    ...
};

Вы можете продолжить полностью участвовать в любой функции в cpp

int CYourClass::foo()
{
    std::list<int>::iterator iter = myListOfInts.begin();
    ...
}

вам действительно никогда не нужно "использовать пространство имен std". Только если вы обнаружите, что вы набираете std :: слишком много, тогда полезно добавить «использование пространства имен std», чтобы сохранить ваши собственные нажатия клавиш и улучшить читаемость вашего кода. Это будет ограничено рамками заявления.

int CYourClass::foo()
{
    using namespace std;
    list<int>::iterator iter = myListOfInts.begin();
    ...
}
0 голосов
/ 23 июня 2009

Не стоит распространяться по вашему коду using namespace std; только потому, что вам это удобно. Но если вы настаиваете на этом, вы можете поместить свой собственный код в это пространство имен. И только позже, когда вы на самом деле будете использовать ваши функции / классы в основном файле, вы определите using namespace std;. Просто чтобы подчеркнуть, что я говорю, вот пример:

namespace std
{
   class MyNewClass
   {
       public:
             MyNewClass( ) { out << "Hello there" << endl;};
   };
}; 

int main( )
{
    std::MyNewClass tmp;
};
0 голосов
/ 23 июня 2009

Пространство имен не распространяется на другие файлы. Вы должны поместить его в каждый из файлов или просто явно вызвать ваши классы.

либо:

с использованием пространства имен std; бла << х; </p>

или

std :: blah << x; </p>

Выбор - выбор стиля, либо работает на практике.

Если компилятор не «распознает» пространство имен, это потому, что вы не включили файл определения, который его объявляет (т.е. включает)

0 голосов
/ 23 июня 2009

По сути, вам нужно сделать выбор:

1) «поступай правильно», включив using namespace std во все свои файлы cpp или

2) добавить using namespace std в некоторый общий заголовочный файл.

Разные люди будут иметь разные мнения о том, что лучше всего, однако, если вы спросите меня, я бы решил поместить using namespace std в общий заголовок. На мой взгляд, пространство имен std - это просто «стандарт», и любые конфликты имен необходимо разрешать на уровне кода, а не полагаться на пространства имен.

0 голосов
/ 23 июня 2009

Вы можете поместить его в нескольких местах - в каждом файле .cpp.

...