Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Подключение модулей |
Автор: Kirgston 5.1.2010, 00:13 | ||
Ребята вот такой вот вопросик... есть IT.h
Если я этот код даю в инклюд в другом файле, точнее не код а файл то получается еррор: 1>IT.obj : error LNK2005: "struct gObjIllusionPlayerCFG (* gObjIllusionPlayer)[40]" (?gObjIllusionPlayer@@3PAY0CI@UgObjIllusionPlayerCFG@@A) уже определен в main.obj 1>IT.obj : error LNK2005: "struct gObjIllusionCommonCFG gObjIllusionCommon" (?gObjIllusionCommon@@3UgObjIllusionCommonCFG@@A) уже определен в main.obj 1>IT.obj : error LNK2005: "struct gObjIllusionTeamCFG * gObjIllusionRoom" (?gObjIllusionRoom@@3PAUgObjIllusionTeamCFG@@A) уже определен в main.obj 1>IT.obj : error LNK2005: "struct SkillStruct * gObjSkillStruct" (?gObjSkillStruct@@3PAUSkillStruct@@A) уже определен в main.obj 1> Создается библиотека D:\VC 2008 Samples\Addon\Release\Addon.lib и объект D:\VC 2008 Samples\Addon\Release\Addon.exp 1>D:\VC 2008 Samples\Addon\Release\Addon.dll : fatal error LNK1169: обнаружен многократно определенный символ - один или более 1>Журнал построения был сохранен в "file://d:\VC 2008 Samples\Addon\Addon\Release\BuildLog.htm" 1>Addon - ошибок 5, предупреждений 3 ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== |
Автор: Cheloveck 5.1.2010, 00:30 | ||
нельзя в хедерах переменные объявлять. получается, что у тебя одна и та же переменная во всех единицах трансляции. для таких целей есть ключевое слово extern. объявляешь в одном из cpp файлов свои переменные, а к объявлению в хедере добавляешь слово extern.
|
Автор: Kirgston 5.1.2010, 10:13 |
пфф добавил екстерн - та же ошибка. Во всех модулях использую #pragma once . В принципе перенес обявление переменных структур в cpp модуль. Они мне и так не нужны как глобальные. Но не пойму... почему я их не могу сделать глобальными? ... |
Автор: Cheloveck 5.1.2010, 18:53 | ||||||
Ты их можешь сделать глобальными. Но компилироваться они должны только в одном модуле. А ключевое слово extern говорит о том, что переменную компоновщику нужно искать в другом obj файле. Это немного другое. Это защита от повторного включения, а не гарантия включения) Как говорил Станиславский: "Не верю!". Что-то где--то не так сделал. Код в студию (и .cpp и .h). Кстати, ты не забыл включить заголовочный файл везде, где используешь эти переменные? Добавлено через 41 секунду Да, и к слову, глобальные переменные - это зло. А extern глобальные переменные - зло в квадрате. Добавлено через 5 минут и 28 секунд
Ну, двумерный массив, это что бы разрешить последующие вопросы. Добавлено через 6 минут и 3 секунды Выводит, естесственно, 100 |
Автор: Cheloveck 5.1.2010, 19:08 | ||
![]()
каюсь. прошу пощады. не вели казнить! |
Автор: Kirgston 5.1.2010, 21:11 |
Ну сорц то очень длинный... порядка 1к строчек. Просто как... конечно ничего не забыл и т.д. щас всё перевел на "локальные переменные" и всё работает. Конечно мб оно то и зло в квадрате... но иногда зло крайне необходимо)))) ну так построена программка. Причем в других модулях есть такое (тоже екстерн и т.д.) и они спокойно подключаются... а тут почему то начинает орать... ладно бог с ним =) проблему решил хоть не нормальным способом, но решил =) |