использование пространства имен - PullRequest
3 голосов
/ 22 января 2010

Я пытаюсь начать использовать пространства имен правильным (или, по крайней мере, лучшим) способом.

Первое, что я попытался сделать, - это не указывать using namespace xxx; в начале моих файлов.Вместо этого я хочу using xxx::yyy как можно локально.

Вот небольшая программа, иллюстрирующая это:

#include <iostream>
#include <cstdlib>
#include <ctime>

int main() {
   using std::cout;
   using std::endl;

   srand(time(0));

   for(int i=0; i<10;++i)
      cout << rand() % 100 << endl;

   return 0;
}

Если я опускаю строки using std::cout; или using std::endl,компилятор будет жаловаться, когда я пытаюсь использовать cout или endl.

Но почему это не нужно для srand, rand и time?Я почти уверен, что они находятся в std, потому что, если я попытаюсь специально налить std:: перед ними, мой код работает нормально.

Ответы [ 4 ]

6 голосов
/ 22 января 2010

Если вы используете cstdlib et al. имена в них размещаются как в глобальном пространстве, так и в пространстве имен std ::, так что вы можете выбрать префикс с помощью std :: или нет. Некоторые рассматривают это как особенность, а другие - как ошибку.

3 голосов
/ 22 января 2010

Я предпочитаю опускать использование и просто каждый раз иметь std :: cout только для того, чтобы поддерживать читабельность.хотя это, вероятно, полезно только в крупных проектах

3 голосов
/ 22 января 2010

Если вы действительно хотите знать, внимательно посмотрите на заголовки ctime и cstdlib. Они были построены обратно совместимыми.

Примечание: все это using против using namespace бизнеса связано с удобочитаемостью. Если ваша IDE позволит просто не показывать пространства имен, когда вы не хотите их видеть, вам не понадобятся эти конструкции ...

0 голосов
/ 22 января 2010

Пока мы обсуждаем эту тему, существует также вещь, называемая Koenig Lookup , которая позволяет вам опустить идентификатор пространства имен перед именем функции, если аргументы, которые он принимает, происходят из того же пространства имен.

Например

#include <iostream>
#include <algorithm>
#include <vector>

void f(int i){std::cout << i << " ";}
int main(int argc, char** argv)
{
   std::vector<int> t;
   // for_each is in the std namespace but there's no *std::* before *for_each*
   for_each(t.begin(), t.end(), f); 
   return 0;
}

Ну, это не связано напрямую, но я думаю, что это может быть полезно.

...