Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 22.03.2018, 23:26   #1
rassant
Новичок
 
Регистрация: 30.01.2014
Сообщений: 3
Репутация: 10
По умолчанию Линковка и пространство имен.

файл main.cpp содержит следующий код:
Код:

#include "coordin.h"
int main() {
    using bob::age; <- Ошибка.
    return 0;
}

файл file.cpp содержит следующий код:
Код:

#include "coordin.h"
namespace bob{
     int age=5;
}

файл coordin.h содержит следующий код:
Код:

#ifndef COORDIN_H
#define COORDIN_H
namespace bob{};
#endif //COORDIN_H

Вопрос:
Почему происходит ошибка при сборке проекта?
Как определить переменную в пространстве имен bob не в main.cpp файле? Сохранит ли значение переменной age если к ней обратиться из другого файла?
rassant вне форума   Ответить с цитированием
Старый 23.03.2018, 04:56   #2
_Bers
Профессионал
 
Регистрация: 16.12.2011
Адрес: Москва
Сообщений: 2,107
Репутация: 826
По умолчанию

http://www.c-cpp.ru/books/extern
_Bers вне форума   Ответить с цитированием
Старый 23.03.2018, 05:02   #3
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,021
Репутация: 2028

icq: 216409213
По умолчанию

Какой стандарт доступен? До С++17 мутите с extern, после можно в h файле определить с inline.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 23.03.2018, 10:51   #4
rassant
Новичок
 
Регистрация: 30.01.2014
Сообщений: 3
Репутация: 10
По умолчанию

Цитата:
До С++17 мутите с extern
Так у меня же один раз определяется переменная age.
причем тут extern?
1) создал пространство имен bob
2) добавляю туда новую переменную.
3) Пытаюсь получить доступ к этой новой переменной из другого файла.
rassant вне форума   Ответить с цитированием
Старый 23.03.2018, 11:12   #5
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 954
Репутация: 667
По умолчанию

Цитата:
Сообщение от rassant Посмотреть сообщение
Пытаюсь получить доступ к этой новой переменной из другого файла.
Вот в этот момент и должен быть extern. Именно потому, что переменная уже определена в другом файле.

Общая схема такая: в одном из .cpp переменная определяется (без extern), а в соответствуещем .h - объявляется уже с extern.
Black Fregat вне форума   Ответить с цитированием
Старый 24.03.2018, 17:27   #6
_Bers
Профессионал
 
Регистрация: 16.12.2011
Адрес: Москва
Сообщений: 2,107
Репутация: 826
По умолчанию

Цитата:
Сообщение от rassant Посмотреть сообщение
Так у меня же один раз определяется переменная age.
причем тут extern?
1. читаем что такое extern
2. если не понятно - читаем из другого источника.
_Bers вне форума   Ответить с цитированием
Старый 24.03.2018, 17:30   #7
New man
Участник клуба
 
Регистрация: 24.01.2011
Сообщений: 704
Репутация: 241
По умолчанию

Суть в том, что всё, что написано в файлах, подключенных в #include, копируется в место #include.
Соответственно, как раз для того, чтобы не было дублей переменной, и надо объявлять через extern.

Вообще, компилятор, получается, просто копирует текст include в cpp файлы, которые компилируются полностью раздельно.
Соответственно, то, что с неймспейсом произошло в file.cpp, main.cpp не знает.
И переменную надо описать в файле h, чтобы обращаться.
Код:

#ifndef COORDIN_H
#define COORDIN_H
namespace bob{
   extern int age;
};
#endif //COORDIN_H


И да, из того, что файл h — это просто копируемый текст, следует, что можно было написать, и это должно работать:
Код:

#include "coordin.h"
namespace bob{extern int age;};
int main() {
    using bob::age; <- Ошибка.
    return 0;
}

__________________
a.k.a. Angelicos Phosphoros
Мой сайт

Последний раз редактировалось New man; 24.03.2018 в 17:37.
New man вне форума   Ответить с цитированием
Старый 24.03.2018, 18:21   #8
Tuxford
Новичок
 
Регистрация: 24.03.2018
Адрес: Саливонки Сити
Сообщений: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Какой стандарт доступен? До С++17 мутите с extern, после можно в h файле определить с inline.
Для С++ extern как то дико.

В данном случае вариант
Код:

namespace bob{
   static const int age;
};

При этом в CPP надо инициализировать age
Tuxford вне форума   Ответить с цитированием
Старый 24.03.2018, 18:23   #9
Tuxford
Новичок
 
Регистрация: 24.03.2018
Адрес: Саливонки Сити
Сообщений: 5
Репутация: 10
По умолчанию

Ошибка на строке using bob::age; все верно. Это вам не Java.

Надо using bob;
Tuxford вне форума   Ответить с цитированием
Старый 24.03.2018, 18:35   #10
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,790
Репутация: 3300

icq: 512-765
skype: alexp.frl
По умолчанию

А причем тут Java?
Можно ж и в С++ using std::vector; и т.п.

Но да, для переменной как хотел автор нельзя.
Alex11223 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пространство имен RAFA91 Общие вопросы .NET 23 13.11.2015 19:40
Пространство имен XML Oleg_SS Общие вопросы Delphi 4 19.08.2014 10:36
Добавить пространство имен в стандартное расширение Jeckor C# (си шарп) 1 14.06.2014 18:19
Как подключить пространство имен InteropServices.Automation Diskretor WPF, UWP, WinRT, XAML 1 27.01.2013 19:47
Линковка... GHOST_Kasper Работа с сетью в Delphi 13 21.11.2007 17:06


03:01.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru