Пространства имен и C ++ - PullRequest
       1

Пространства имен и C ++

6 голосов
/ 02 августа 2010

Я заметил, что в C ++ пространства имен очень редко используются, в то время как в .Net это очень распространено.Есть ли какая-то особая причина для этого.

Также я хотел бы знать, видели ли другие, как обычно используются пространства имен в C ++.

РЕДАКТИРОВАТЬ: На самом деле я имею в виду пользовательские приложения, а не стандартные библиотекикак STL или любая другая вещь.

Ответы [ 9 ]

10 голосов
/ 02 августа 2010

В C ++ пространства имен были добавлены в язык через некоторое время после первоначальной реализации, поэтому было много кода приложения, который их не использовал.Таким образом, также из-за их позднего добавления вся стандартная библиотека была помещена в одно пространство имен.Следовательно, с простым using namespace std; вы можете в значительной степени игнорировать пространства имен, если хотите.

В C #, с другой стороны, пространства имен были задействованы с самого начала, и библиотека была разделена на большое количествоиз них.Кроме того, все мастера используют для создания своего исходного кода, по умолчанию помещают классы в пространство имен.Это вызвало гораздо большую осведомленность о пространствах имен.

7 голосов
/ 02 августа 2010

Пространства имен в C ++ совсем не такие, как в .Net, ActionScript и Java (которые используют одну и ту же концепцию).Они вовсе не являются одним и тем же понятием.

В C ++ пространства имен находятся в основном там, чтобы обеспечить инкапсуляцию нескольких типов и функций в именованном контексте, пространстве имен.Речь идет только об именовании и доступе к именам.

В .Net, ActionScript и Java пространства имен больше относятся к модулям, чем к именам.Они вынуждают разработчика разрабатывать его код в отдельных пространствах имен, каждое из которых имеет одну цель - контекст.Поскольку эти языки являются динамическими (вместо статических, как C ++), пространства имен позволяют позднее связывать типы с кодом, что ускоряет компиляцию, потому что вам нужно только иметь каноническое имя (пространство имен + имя) типа, который вы хотите использовать в файле,

В C ++ нет модуля comcept, только модули компиляции, которые вообще ничего не знают друг о друге.

Теперь об их использовании часто бывает полезно использовать пространство имен в C ++ дляинкапсулировать модуль (исполняемый или dll / so), некоторый код реализации или любую полезную часть кода.При этом в большинстве случаев лучше не иметь слишком глубокую иерархию пространств имен.По историческим причинам многие разработчики на C ++ даже долгое время не знали, что в C ++ есть функция с именем namespace.Теперь то, что мы называем «современным C ++», предполагает, что вы знаете об этом, но много старого кода C ++ по-прежнему используется сегодня, и, возможно, это то, на что вы обращаете внимание, когда говорите о пространствах имен.

пространства имен в C ++ являютсядругая особенность, чем в других языках, делает его более или менее заметным в коде.На самом деле, он настолько отличается, что вы вообще не будете управлять им одинаково, что делает код действительно трудным для понимания, когда вы приходите, скажем, из .Net.Так что вам не следует одинаково использовать пространства имен между языками, это действительно разные понятия.

3 голосов
/ 02 августа 2010

Я заметил, что в C ++ пространства имен очень редко используются

Сможете ли вы подтвердить это соответствующими эмпириками? Boost , Qt , STL, ... все используют пространства имен.

2 голосов
/ 02 августа 2010

Самый простой ответ: при запуске программы в Visual Studio (2003 и более поздних версиях) она создает namespaces по умолчанию. Другие (более старые) IDE нет, я полагаю.

.NET поощряет это с самого начала. Пространства имен не всегда были частью оригинальной реализации в C ++. Он получил тягу с .Net.

0 голосов
/ 02 августа 2010

Одна из причин заключается в том, что некоторые популярные компиляторы (в частности, gcc) добавили поддержку пространств имен довольно поздно, и для большей переносимости многие проекты были запущены без пространств имен. Конечно, для нового проекта использование пространств имен было бы странным.

0 голосов
/ 02 августа 2010

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

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

0 голосов
/ 02 августа 2010

Пространства имен - ваш лучший друг в больших проектах!

Видите это или нет - не имеет значения.Прими привычку их использовать.

0 голосов
/ 02 августа 2010

Работая в 5 разных местах, я могу сказать, что 2 из 5 использовали пространства имен до того, как я присоединился.

Полагаю, что пространства имен в C ++ не используются так часто (как они должны?) Из-за синтаксического синтаксиса.

т.е.: я хочу написать это:

namespace xml::xmpp::core { }

Но вместо этого нужно написать это:

namespace xml { namespace xmpp { namespace core { } } }

И чтобы объявить вперед, я хотел бы написать:

class xml::parser;

Но надо написать

namespace xml { class parser; }

Но я могу написать:

using namespace xml::xmpp::core;

На немного другой ноте, кто-нибудь может сказать, почему классы должны заканчиваться точкой с запятой, а что-нибудь еще (функции, пространства имен) - нет?

0 голосов
/ 02 августа 2010

Библиотеки Boost C ++ широко используют пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...