Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

файл 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, 03:56   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

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

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

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

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

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

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

Суть в том, что всё, что написано в файлах, подключенных в #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 в 16:37.
New man вне форума Ответить с цитированием
Старый 24.03.2018, 17:21   #8
Tuxford
 
Регистрация: 24.03.2018
Сообщений: 5
По умолчанию

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

В данном случае вариант
Код:
namespace bob{
   static const int age;
};
При этом в CPP надо инициализировать age
Tuxford вне форума Ответить с цитированием
Старый 24.03.2018, 17:23   #9
Tuxford
 
Регистрация: 24.03.2018
Сообщений: 5
По умолчанию

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

Надо using bob;
Tuxford вне форума Ответить с цитированием
Старый 24.03.2018, 17:35   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Но да, для переменной как хотел автор нельзя.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пространство имен RAFA91 Общие вопросы .NET 23 13.11.2015 18: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 16:06