2015-10-27 4 views
1

Прежде всего, я не могу понять структуру стандартной библиотеки C++ или std. Например, «Привет, мир!» Программа выглядит следующим образом:Когда я должен использовать свои собственные пространства имен?

#include <iostream> 

int main() { 
    std::cout << "Hello, world!" << std::endl; 
} 

Более сложная программа для генерации случайных чисел и время выполнения Assesment выглядит следующим образом:

#include <iostream> 
#include <random> 
#include <chrono> 
#include <time.h> 

int main() { 
    std::chrono::time_point<std::chrono::system_clock> start, end; 
    std::tr1::default_random_engine eng(static_cast<unsigned int>(time(NULL))); 
    std::tr1::uniform_int<int> unif(0, 99); 

    start = std::chrono::system_clock::now(); 

    for (int i = 0; i < 10; i++) { 
     for (int j = 0; j < 10; j++) { 
      std::cout << unif(eng) << " "; 
     } 

     std::cout << std::endl; 
    } 

    end = std::chrono::system_clock::now(); 

    int elapsed_milliseconds = std::chrono::duration_cast<std::chrono::milliseconds> (end - start).count(); 

    std::cout << "Elapsed time: " << elapsed_milliseconds << "ms" << std::endl; 

    std::cin.get(); 
    return 0; 
} 

По моему коду мнения так:

std::tr1::uniform_int<int> unif(0, 99); 

или это :

std::chrono::time_point<std::chrono::system_clock> start, end; 

выглядит очень уродливо. Конечно, я могу использовать что-то вроде этого:

using namespace std; 
using namespace std::tr1; 
using namespace std::chrono; 

Но этот код может вызвать некоторые проблемы: Why is "using namespace std" considered bad practice?

Я не могу понять причину создания вложенных пространств имен в библиотеке Standrad. Это только одна причина, связанная с конфликтами функций имени? Или что-то другое?

И для моего собственного проекта, когда я должен использовать свои собственные пространства имен?

+0

Если вы используете C++ 11, вам не нужен 'std :: tr1', поскольку был включен [TR1] (https://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1). – rici

+0

@rici да, он работает без 'std :: tr1'. Я этого раньше не знал. –

ответ

1

Пространство имен является логической группой. Нет никаких правил использования пространства имен. Либо вы можете использовать, либо не использовать пространство имен. Но все дело в организации вашего кода, библиотеки или API. Прочтите это для некоторых рекомендаций «Herb Sutter» http://www.gotw.ca/publications/mill08.htm

Также вы можете использовать using namespace std; для открытого пространства имен. Нет никакого правила, говорит не могу. Но все о кодировании хороших практик для следующего программиста, чтобы упростить понимание и сохранить удобство обслуживания.

Вы можете использовать одно или несколько пространств имен для своей программы, особенно если вы создаете API или библиотеку, которая будет распространяться среди общественности.

А также помогает разделить модуль в больших программах. и позволяют программистам работать без зависимости.

Подумайте Google имеет две команды пользовательского интерфейса для веб-сайтов и mobiles.They может использовать отдельное пространство имен для своих модулей кода

Google:Web:UI и Google:Mobile:UI

даже они могут дополнительно расширить, как

Google:Web:UI:controls и Google:Mobile:UI:controls

Или они могут использовать

Google:controls:Web:UI и Google:controls:Mobile:UI

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

Такая же история для STDLIB. Разработчики создают структуру пространства имен для организации модулей. Но это не может быть идеальным способом. но вы должны использовать его. Если вы не любите, то можете использовать псевдонимы http://en.cppreference.com/w/cpp/language/namespace_alias.

Если вы собираетесь создать свою программу. прочитайте, как другие используют. особенно популярный проект на C++, например Linuxboost и т. д. загрузите код и посмотрите. Если ваша программа действительно простая, вам может не понадобиться так много заботиться. Но всегда читайте и сохраняйте хорошую практику (читайте эту книгу для получения дополнительной информации). http://www.gotw.ca/publications/c++cs.htm

Смежные вопросы