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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальные переменные, Проблема видимости 
V
    Опции темы
TheDestroyer
Дата 21.6.2009, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помогите пожалуйста разобраться со следущей проблемой. 
Есть структура, которая должна использоваться в нескольких .cpp файлах. В testapp.h файле определяю эту структуру и map, использующий ее. Надо чтобы этот map был виден в testapp.cpp и file2.cpp. Делаю так:
testapp.h:
Код

#ifndef __VARIABLE__
#define __VARIABLE__
#include "stdafx.h"
using namespace std;
struct info_struct
{
string test;
} i_struct;
map<string,info_struct> info;
void func();
#endif

testapp.cpp:
Код

#include "stdafx.h"
#include "testapp.h"
using namespace std;
extern map<string,info_struct> login_info;
int _tmain(int argc, _TCHAR* argv[])
{
info["123"].test = "test";
func();
    return 0;
}

file2.cpp:
Код

#include "stdafx.h"
#include "testapp.h"
using namespace std;
extern map <string,info_struct> login_info;
void func()
{
info["321"].test = "test1";
}

Если я вставляю #include "testapp.h" в file2.cpp, то получаю ошибку:
Код

1>file2.obj : error LNK2005: "class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct info_struct,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,struct info_struct> > > info" (?info@@3V?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@Uinfo_struct@@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@Uinfo_struct@@@std@@@2@@std@@A) уже определен в testapp.obj
1>file2.obj : error LNK2005: "struct info_struct i_struct" (?i_struct@@3Uinfo_struct@@A) уже определен в testapp.obj
1>C:\Documents and Settings\Sergey\Рабочий стол\test\testapp\Debug\testapp.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более

т.е. многократное определение
Если же я не вставляю #include "testapp.h" в file2.cpp, то info_struct невидна в нем.
Как правильно объявить и использовать глобальные переменные в этом случае?

PM MAIL   Вверх
Cheloveck
Дата 21.6.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



Код

extern info_struct i_struct;



--------------------
user posted image
PM Jabber   Вверх
TheDestroyer
Дата 21.6.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ругается не на отсутствие определения струтуры, а на переобъявление map-а.
Если не сложно поясните, плз.
PM MAIL   Вверх
mes
Дата 21.6.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



в хидере:          extern map <string,info_struct> login_info; 
в одном из cpp : map <string,info_struct> login_info


--------------------
PM MAIL WWW   Вверх
zim22
Дата 21.6.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



вы только объявляете login_info.
где вы его определяете?
Код

extern map<string,info_struct> login_info;



--------------------
PM MAIL   Вверх
TheDestroyer
Дата 21.6.2009, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, при объявлени глобальных переменных следует использовать "extern", при использовании в других файлах этих переменных их следует просто объявить еще раз, незабыв сделать include файла, в котором было объявление с "extern".
PM MAIL   Вверх
mes
Дата 21.6.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(TheDestroyer @  21.6.2009,  20:13 Найти цитируемый пост)
при использовании в других файлах этих переменных их следует просто объявить еще раз

нет. нужно определить только один раз (в одном из cpp). А в местах использования объявлять как extern (или один раз объявить в хидере как еxtern и включать этот хидер)


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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