Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > namespace в .h файле


Автор: mrgloom 15.11.2013, 10:27
если 

test.h

Код

namespace MyNamespace
{
class MyClass
{ //implementation};
};

using MyNamespace::MyClass;


то это тоже самое если бы мы использовали MyClass без неймспейса?

Автор: vinter 15.11.2013, 10:48
по поведению - да. На деле у функций при линковке будут более "испорченные" имена. Но это мало кого волнует.
Так обычно делают, когда портируют старый, C, код в C++. Так, например, сделали с C наследием в C++. Формально, все C функции переехали в std, но их можно использовать без префикса за счёт using namespace в заголовке.

Автор: akizelokro 15.11.2013, 11:34
необязательно уточню.
если у тебя пара namespace c определением MyClass, то может возникнуть конфликт имён (?!). Или иная коллизия при обращении ( но никогда с таким не сталкивался).

namespace - это средство упорядочения областей видимости

Автор: mrgloom 15.11.2013, 12:02
я понимаю для чего нужен namespace
вопрос был как раз зачем в .h файле писать using MyNamespace::MyClass;

Автор: bsa 15.11.2013, 12:07
Цитата(mrgloom @  15.11.2013,  13:02 Найти цитируемый пост)
вопрос был как раз зачем в .h файле писать using MyNamespace::MyClass; 
Ты это у автора спроси. Возможно, это необходимо для совместимости со старой версией библиотеки.

Автор: mrgloom 15.11.2013, 14:38
Цитата

 это необходимо для совместимости со старой версией библиотеки

поясните ?

Автор: bsa 15.11.2013, 14:45
mrgloom, пример.
Когда-то Вася Пупкин сделал на С++ маленькую библиотечку для себя. Он не заморачивался ни на пространства имен, ни на названия функций.
Через какое-то время, эту библиотечку оценили другие программисты и стали пользоваться. Она росла и развивалась... В какой-то прекрасный момент ее захотели использовать в крупном проекте. Подключили... И при первой компиляции на этапе линковки вывалилась куча конфликтов имен функций - часть функций библиотеки совпадали сигнатурами с внутренними функциями проекта. Вася Пупкин, когда узнал о проблеме, покумекал и решили пойти простым путем - засунул все функции в некое пространство имен, а чтобы старый код компилировался сделал такие using'и. В итоге, сигнатуры функций стали отличаться от тех, что были в большом проекте.

Автор: mrgloom 18.11.2013, 10:10
ну так всё равно же надо писать тогда.

namespace1::doit()
namespace2::doit()

я имею ввиду что это правильный пример использования, но это не объясняет зачем в .h файле использовать using namespace.

Автор: bsa 18.11.2013, 10:36
mrgloom, а ты попробуй написать программу, которая использует MyClass без указания пространства имен. И увидишь, что без using она не скомпилируется.

Автор: vinter 18.11.2013, 10:36
Цитата

ну так всё равно же надо писать тогда.

Зачем? После using MyNamespace::MyClass; в заголовке, MyClass может быть использован без префикса везде.

Автор: bsa 18.11.2013, 10:37
Цитата(mrgloom @  18.11.2013,  11:10 Найти цитируемый пост)
но это не объясняет зачем в .h файле использовать using namespace.
Чтобы пользователям библиотеки не пришлось менять свой код.

Автор: mrgloom 18.11.2013, 12:56
вы имеете ввиду такую ситуацию?

допустим есть .cpp файл

в нём включен .h файл с namespace1  и функцией doit()

потом мы в .cpp файле используем doit() без namespace, но ведь если включено что то с namespace2::doit(), то мы уже не можем использовать просто doit()? т.е. нам надо либо использовать namespace1::doit() и namespace2::doit(), либо включать в .cpp  .h файл только с одним namespace, что по-моему равнозначно вообще неиспользованию namespace.

Автор: vinter 18.11.2013, 14:18
Цитата

потом мы в .cpp файле используем doit() без namespace, но ведь если включено что то с namespace2::doit(), то мы уже не можем использовать просто doit()? т.е. нам надо либо использовать namespace1::doit() и namespace2::doit(), либо включать в .cpp  .h файл только с одним namespace, что по-моему равнозначно вообще неиспользованию namespace.

всё верно. Именно поэтому мы и предположили, что это было сделано для совместимости. со старым кодом, который ничего про namespace не ведает. Ну ли просто от безграмотности smile

Автор: mrgloom 26.11.2013, 10:09
еще интересный участок кода


Код

namespace PNGLIB
{
#include "LibPNG\Include\png.h"
}

namespace IPL
{
#include "IPL\Include\ipl.h"
}
using namespace IPL;


по идее же мы заиклюдим и в первом и во втором случае? смысл таких конструкций?

Автор: vinter 26.11.2013, 10:26
mrgloom, в 51-й раз: никто не может сказать зачем кто-то что-то сделал кроме того, кто это сделал. Но так делают при использовании кода, который не использует namespace(например C библиотеки) с оными. Т.е. всё оборачивается в namespace т.к. с точки зрения C++ так делать вернее. И, где это можно, использовать именно с явными квалификаторами. При этом добавив using namespace, чтобы не сломать весь код, который использует ту или иную библиотеку без namespace.

Автор: mrgloom 26.11.2013, 11:27
так чем будет отличаться первый и второй вариант включения .h файла? по-моему и так и так будет работать.
И еще вопрос, если мы инклюд помещаем в неймспейс, то функции которые определены в .h файле что тоже помещаются в неймспейс?

Автор: vinter 26.11.2013, 12:03
Цитата

так чем будет отличаться первый и второй вариант включения .h файла?

В новом коде можно начать использовать квалифицированные имена, с тем, чтобы в последствии убрать этот using namespace. Эта мера должна быть временной. 
Цитата(mrgloom @  26.11.2013,  12:27 Найти цитируемый пост)
И еще вопрос, если мы инклюд помещаем в неймспейс, то функции которые определены в .h файле что тоже помещаются в неймспейс?

да. Посмотри, к примеру, как отличаются стандартные файлы cctype и ctype.h

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)