Форум программистов, компьютерный форум CyberForum.ru

Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
11.02.2013, 13:35     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #1
Привет всем.

Столкнулся тут с какой-то непонятной ситуацией - в книжке (Steven Prata) описано создание namespace'ов, которые почему-то в VS10 напрочь отказываются функционировать.

Есть небольшая программулина (скорее балуюсь), состоит из 3х файлов - .cpp1, .cpp2, ну и .h (хедер)
cpp1 содержит, как обычно: main и все такое; в cpp2 - дефиниции, определения то бишь функций; а в .h - всякие прочие прототипы-константы.
В cpp1 было объявлено десятка 2 глобальных переменных, которые я хотел бы перенести, т.е. объявить во 2м файле, ну просто для удобства. Насколько я понимаю, если так сделать (скажем, объявить в cpp2 переменную: int myvariable = 0; ), то в cpp1 придется писать: extern int myvariable, чтобы она стала видимой, типа external linkage).
Дык вот, Prata пишет, что это способ дедовский и проще добавить свой namespace для таких целей. Делается так: объявляется в .cpp2 namespace, скажем:
namespace myown {
................ тут объявления переменных и прочее
}

А в cpp1 потом просто пишем:
using namespace myown;

И все, это добавляет объявленные нами во 2м файле переменные в глобальное пространство имен.
А вот хрен там, гр*баной студии на это по ходу пофигу. Создаю в .cpp2 namespace, в .cpp1 прописываю: using namespace myown; - и ноль реакции, переменные, которые объявлены во 2м файле, не видятся и подчеркиваются, типа "нет таких".

VS10 вообще полностью поддерживает namespace'ы?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
11.02.2013, 13:52     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #2
использование пространств имен не отменяет использования включения заголовочных файлов. компилятор не может найти указанное вами пространство имен. вы должны включить заголовок.
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
11.02.2013, 14:01  [ТС]     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #3
Цитата Сообщение от vxg Посмотреть сообщение
использование пространств имен не отменяет использования включения заголовочных файлов. компилятор не может найти указанное вами пространство имен. вы должны включить заголовок.
В том-то и дело, что включен заголовок.
Ну, т.е. в .cpp1 прописано:
#include "blablabla.h"

Ну и в .cpp2 (где объявлены переменные и создан namespace) тоже включен заголовок.
При этом cpp2 в сpp1 я при помощи include не добавлял, просто cpp файл добавлен в проект.
Ну, т.е. такого в cpp1 не прописано:
#include "blablabla.cpp2"
Но вроде как это и ошибкой считается, так добавлять один cpp в другой.
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
11.02.2013, 14:32     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #4
файл file1.h
C++
1
2
3
4
5
6
7
8
9
10
#ifndef file1_h
#define file1_h
 
namespace my_namespace
{
    extern int x;
    int f(void);
}
 
#endif
файл file1.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "file1.h"
 
namespace my_namespace
{
    int x;
    int f(void)
    {
        return x;
    }
}
файл main.cpp
C++
1
2
3
4
5
6
7
8
9
#include "file1.h"
 
int main(int argc, char* argv[])
{
    int y = my_namespace::x;
    int z = my_namespace::f();
 
    return 0;
}
Добавлено через 1 минуту
...если не боитесь пересечься именами и не желаете писать my_namespace:: вставьте после включения заголовка
C++
1
using namespace my_namespace;
но на необходимость включения заголовка это не повлияет
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
11.02.2013, 15:27  [ТС]     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #5
Цитата Сообщение от vxg Посмотреть сообщение
файл file1.h
C++
1
2
3
4
5
6
7
8
9
10
#ifndef file1_h
#define file1_h
 
namespace my_namespace
{
    extern int x;
    int f(void);
}
 
#endif
файл file1.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "file1.h"
 
namespace my_namespace
{
    int x;
    int f(void)
    {
        return x;
    }
}
файл main.cpp
C++
1
2
3
4
5
6
7
8
9
#include "file1.h"
 
int main(int argc, char* argv[])
{
    int y = my_namespace::x;
    int z = my_namespace::f();
 
    return 0;
}
Добавлено через 1 минуту
...если не боитесь пересечься именами и не желаете писать my_namespace:: вставьте после включения заголовка
C++
1
using namespace my_namespace;
но на необходимость включения заголовка это не повлияет
Спасибо! Таким образом все переменные опознались. Т.е., как я понял, в заголовке обязательно нужно указать все те же переменные, что обявлены в file1.cpp, только с квалификатором extern? Почему-то Prata про это ничего не пишет, наоборот он советовал в заголовочном файле объявлять только константы, прототипы функций, inline-функции, шаблоны классов и т.д. А обычные переменные якобы нужно объявлять в cpp в отдельном неймспейсе.

И ещё фишка, которую у него прочел, но которая в VS почему-то не работает. Он пишет, что если мы в "своем" неймспейсе укажем, допустим:
namespace my_namespace
{
using std::cout;
using std::ifstream;
using std::endl;
}

То в main.cpp нам достаточно будет раскрыть "наше" пространство имен:
using namespace my_namespace;

И using-декларации добавятся автоматом вместе с объявленными нами переменными в общее простанство имен.
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
11.02.2013, 15:43     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #6
Цитата Сообщение от Excogit8er Посмотреть сообщение
А обычные переменные якобы нужно объявлять в cpp в отдельном неймспейсе
если хотите их там похоронить - да. иначе тем или иным способом придется проинформировать другие модули о наличии данных переменных.
Цитата Сообщение от Excogit8er Посмотреть сообщение
И using-декларации добавятся автоматом вместе с объявленными нами переменными в общее простанство имен
не пробовал
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
11.02.2013, 15:53  [ТС]     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #7
Цитата Сообщение от vxg Посмотреть сообщение
если хотите их там похоронить - да. иначе тем или иным способом придется проинформировать другие модули о наличии данных переменных.
"Вот и верь после этого людям" (с)
Это которые: Stephen Prata "C++ Primer Plus - Sixth Edition"

не пробовал
Ну вот я попробовал =)
Вообще хз, возможно это от конкретной реализации сильно зависит и в каком-нить GCC у него все и правда компилилось.
Про VS10 он ничего не писал, скорее про стандарт С++11
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
11.02.2013, 15:59     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #8
если пример из книги воспроизведен точно и не хочет работать - это странно. наверное, где-то что-то у него по-другому
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
11.02.2013, 16:19  [ТС]     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #9
Цитата Сообщение от vxg Посмотреть сообщение
если пример из книги воспроизведен точно и не хочет работать - это странно. наверное, где-то что-то у него по-другому
Ну не факт)
Скажем, если ему верить, то вот такой формат инициализации (нулем) переменных тоже рабочий:

C++
1
2
int rocs = {}; 
int psychics {};
А в Microsoft c ним, похоже, не согласны, потому как оба стейтмента отбраковываются компилятором. ))
Про то, что объявленная в namespace в файле file1.cpp переменная должна быть так же указана в том же неймспейсе в хедере с квалификатором extern у него точно не было.
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
11.02.2013, 16:30     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #10
может он ее объявляет как
C++
1
extern int my_namespace::x;
в модуле где идет использование. ну или подразумевает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2013, 16:33     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10
Еще ссылки по теме:

C++ Почему авторы диалоговых окон стараются сделать свои окна максимально похожими на стандартные окна?
Ошибка при компиляции проекта VS10 на VS13 C++
Не работает программа сортировки,кто нибудь поймет почему? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
11.02.2013, 16:33  [ТС]     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 #11
Цитата Сообщение от vxg Посмотреть сообщение
может он ее объявляет как
C++
1
extern int my_namespace::x;
в модуле где идет использование. ну или подразумевает
Ну, если только подразумевает
Yandex
Объявления
11.02.2013, 16:33     Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10
Ответ Создать тему
Опции темы

Текущее время: 14:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru