| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > namespace в .h файле |
| Автор: mrgloom 15.11.2013, 10:27 | ||
| если test.h
то это тоже самое если бы мы использовали 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, 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, 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 | ||
всё верно. Именно поэтому мы и предположили, что это было сделано для совместимости. со старым кодом, который ничего про namespace не ведает. Ну ли просто от безграмотности |
| Автор: mrgloom 26.11.2013, 10:09 | ||
еще интересный участок кода
по идее же мы заиклюдим и в первом и во втором случае? смысл таких конструкций? |
| Автор: vinter 26.11.2013, 10:26 |
| mrgloom, в 51-й раз: никто не может сказать зачем кто-то что-то сделал кроме того, кто это сделал. Но так делают при использовании кода, который не использует namespace(например C библиотеки) с оными. Т.е. всё оборачивается в namespace т.к. с точки зрения C++ так делать вернее. И, где это можно, использовать именно с явными квалификаторами. При этом добавив using namespace, чтобы не сломать весь код, который использует ту или иную библиотеку без namespace. |
| Автор: mrgloom 26.11.2013, 11:27 |
| так чем будет отличаться первый и второй вариант включения .h файла? по-моему и так и так будет работать. И еще вопрос, если мы инклюд помещаем в неймспейс, то функции которые определены в .h файле что тоже помещаются в неймспейс? |