Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
#1

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

11.02.2013, 13:35. Просмотров 1323. Ответов 10
Метки нет (Все метки)

Привет всем.

Столкнулся тут с какой-то непонятной ситуацией - в книжке (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'ы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2013, 13:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Namespaces. Кто создавал свои собственные? Почему-то не работает в VS10 (C++):

Не работает программа сортировки,кто нибудь поймет почему? - C++
программа должна брать фамилии из одного файла,сортировать их по алфавиту и выводить в новый файл выдает ошибку при компиляции .не могу...

Создаю свои собственные BB коды - PHP
Сделал свой BB код, как можно сократить код? <?php if(!empty($_REQUEST)){ $b = $_REQUEST; $res =...

Кто создавал плагины на MODX 2.2 - MODx CMS
Можете дать какой то мануал простой по созданию плагина для вывода на любую страницу какого либо jquery скрипта

Кто-нибудь создавал TrueDBGrid динамически? - Visual C++
Установил TrueDBGrid 7, зарегистрировал. Когда кладу грид на диалог, проект на другой машине запускается и ничего не спрашивает. ...

Как правильно создавать свои собственные процедуры? - Delphi
Подскажите, как правильно! Я прописываю процедуру (Delphi 7): Procedure TForm1.Ic(n:Integer;Icon:TIcon); А она мне при...

Кто создавал службу Windows в Qt, поделитесь опытом - C++ Qt
Всем доброго дня! Кто создавал службу Windows в Qt.... поделитесь опытом...

10
vxg
Модератор
3181 / 1984 / 226
Регистрация: 13.01.2012
Сообщений: 7,670
11.02.2013, 13:52 #2
использование пространств имен не отменяет использования включения заголовочных файлов. компилятор не может найти указанное вами пространство имен. вы должны включить заголовок.
0
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
11.02.2013, 14:01  [ТС] #3
Цитата Сообщение от vxg Посмотреть сообщение
использование пространств имен не отменяет использования включения заголовочных файлов. компилятор не может найти указанное вами пространство имен. вы должны включить заголовок.
В том-то и дело, что включен заголовок.
Ну, т.е. в .cpp1 прописано:
#include "blablabla.h"

Ну и в .cpp2 (где объявлены переменные и создан namespace) тоже включен заголовок.
При этом cpp2 в сpp1 я при помощи include не добавлял, просто cpp файл добавлен в проект.
Ну, т.е. такого в cpp1 не прописано:
#include "blablabla.cpp2"
Но вроде как это и ошибкой считается, так добавлять один cpp в другой.
0
vxg
Модератор
3181 / 1984 / 226
Регистрация: 13.01.2012
Сообщений: 7,670
11.02.2013, 14:32 #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;
но на необходимость включения заголовка это не повлияет
1
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
11.02.2013, 15:27  [ТС] #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-декларации добавятся автоматом вместе с объявленными нами переменными в общее простанство имен.
0
vxg
Модератор
3181 / 1984 / 226
Регистрация: 13.01.2012
Сообщений: 7,670
11.02.2013, 15:43 #6
Цитата Сообщение от Excogit8er Посмотреть сообщение
А обычные переменные якобы нужно объявлять в cpp в отдельном неймспейсе
если хотите их там похоронить - да. иначе тем или иным способом придется проинформировать другие модули о наличии данных переменных.
Цитата Сообщение от Excogit8er Посмотреть сообщение
И using-декларации добавятся автоматом вместе с объявленными нами переменными в общее простанство имен
не пробовал
0
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
11.02.2013, 15:53  [ТС] #7
Цитата Сообщение от vxg Посмотреть сообщение
если хотите их там похоронить - да. иначе тем или иным способом придется проинформировать другие модули о наличии данных переменных.
"Вот и верь после этого людям" (с)
Это которые: Stephen Prata "C++ Primer Plus - Sixth Edition"

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

C++
1
2
int rocs = {}; 
int psychics {};
А в Microsoft c ним, похоже, не согласны, потому как оба стейтмента отбраковываются компилятором. ))
Про то, что объявленная в namespace в файле file1.cpp переменная должна быть так же указана в том же неймспейсе в хедере с квалификатором extern у него точно не было.
0
vxg
Модератор
3181 / 1984 / 226
Регистрация: 13.01.2012
Сообщений: 7,670
11.02.2013, 16:30 #10
может он ее объявляет как
C++
1
extern int my_namespace::x;
в модуле где идет использование. ну или подразумевает
0
Excogit8er
2 / 2 / 0
Регистрация: 23.10.2012
Сообщений: 66
11.02.2013, 16:33  [ТС] #11
Цитата Сообщение от vxg Посмотреть сообщение
может он ее объявляет как
C++
1
extern int my_namespace::x;
в модуле где идет использование. ну или подразумевает
Ну, если только подразумевает
0
11.02.2013, 16:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2013, 16:33
Привет! Вот еще темы с ответами:

Кто-нибудь создавал контекстные меню в Access? - MS Access
Привет! Может, кто-нибудь подскажет, как можно создать пользовательскую строку в контекстном меню Access-97? Если, конечно, это возможно

Россия и Китай строят свои собственные космические самолеты. - Другие науки
На страницах нашего сайта мы уже рассказывали об американском секретном космическом самолете X-37B, который успешно возвратился на Землю,...

Народ если кто создавал из Delphi службы то подсабите))) - Delphi
Ни как не могу вызвать из мой службы (сервиса) , батник который в свою очередь вызывает программу и задаёт ей параметры.

Нужен пример использования вместо значений словаря — свои собственные классы - C#
Только начал изучать класс словарей Dictionary, и не могу нигде найти примеров использования вместо значений словаря - свои собственные...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru