Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> namespace в .h файле 
V
    Опции темы
mrgloom
Дата 15.11.2013, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



если 

test.h

Код

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

using MyNamespace::MyClass;


то это тоже самое если бы мы использовали MyClass без неймспейса?
PM MAIL   Вверх
vinter
Дата 15.11.2013, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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

Это сообщение отредактировал(а) vinter - 15.11.2013, 10:49


--------------------
Мой блог
PM MAIL WWW   Вверх
akizelokro
Дата 15.11.2013, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



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

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

Это сообщение отредактировал(а) akizelokro - 15.11.2013, 11:39


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
mrgloom
Дата 15.11.2013, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



я понимаю для чего нужен namespace
вопрос был как раз зачем в .h файле писать using MyNamespace::MyClass;
PM MAIL   Вверх
bsa
Дата 15.11.2013, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(mrgloom @  15.11.2013,  13:02 Найти цитируемый пост)
вопрос был как раз зачем в .h файле писать using MyNamespace::MyClass; 
Ты это у автора спроси. Возможно, это необходимо для совместимости со старой версией библиотеки.
PM   Вверх
mrgloom
Дата 15.11.2013, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата

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

поясните ?
PM MAIL   Вверх
bsa
Дата 15.11.2013, 14:45 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



mrgloom, пример.
Когда-то Вася Пупкин сделал на С++ маленькую библиотечку для себя. Он не заморачивался ни на пространства имен, ни на названия функций.
Через какое-то время, эту библиотечку оценили другие программисты и стали пользоваться. Она росла и развивалась... В какой-то прекрасный момент ее захотели использовать в крупном проекте. Подключили... И при первой компиляции на этапе линковки вывалилась куча конфликтов имен функций - часть функций библиотеки совпадали сигнатурами с внутренними функциями проекта. Вася Пупкин, когда узнал о проблеме, покумекал и решили пойти простым путем - засунул все функции в некое пространство имен, а чтобы старый код компилировался сделал такие using'и. В итоге, сигнатуры функций стали отличаться от тех, что были в большом проекте.
PM   Вверх
mrgloom
Дата 18.11.2013, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



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

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

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

Это сообщение отредактировал(а) mrgloom - 18.11.2013, 10:12
PM MAIL   Вверх
bsa
Дата 18.11.2013, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



mrgloom, а ты попробуй написать программу, которая использует MyClass без указания пространства имен. И увидишь, что без using она не скомпилируется.
PM   Вверх
vinter
Дата 18.11.2013, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата

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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
bsa
Дата 18.11.2013, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(mrgloom @  18.11.2013,  11:10 Найти цитируемый пост)
но это не объясняет зачем в .h файле использовать using namespace.
Чтобы пользователям библиотеки не пришлось менять свой код.
PM   Вверх
mrgloom
Дата 18.11.2013, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



вы имеете ввиду такую ситуацию?

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

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

потом мы в .cpp файле используем doit() без namespace, но ведь если включено что то с namespace2::doit(), то мы уже не можем использовать просто doit()? т.е. нам надо либо использовать namespace1::doit() и namespace2::doit(), либо включать в .cpp  .h файл только с одним namespace, что по-моему равнозначно вообще неиспользованию namespace.
PM MAIL   Вверх
vinter
Дата 18.11.2013, 14:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата

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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
mrgloom
Дата 26.11.2013, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



еще интересный участок кода


Код

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

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


по идее же мы заиклюдим и в первом и во втором случае? смысл таких конструкций?
PM MAIL   Вверх
vinter
Дата 26.11.2013, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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


--------------------
Мой блог
PM MAIL WWW   Вверх
mrgloom
Дата 26.11.2013, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



так чем будет отличаться первый и второй вариант включения .h файла? по-моему и так и так будет работать.
И еще вопрос, если мы инклюд помещаем в неймспейс, то функции которые определены в .h файле что тоже помещаются в неймспейс?
PM MAIL   Вверх
vinter
Дата 26.11.2013, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата

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

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

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



--------------------
Мой блог
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0704 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.