Консультация № 109651
16.11.2007, 08:59
0.00 руб.
0 2 2
Здравствуйте уважаемые эксперты.
Подскажите пожалуйста: есть три срр-файла, и два хедэра в одном из которых собраны заголовки хедэров АПИ необходимые для работы программы, в другом объявлены переменные проекта(глобальные). Подключение этих хедеров выполняется во всех срр-файлах через директивы условной компиляции (см. приложение). При линковке проекта (MSVS2003 .NET) получаю ошибки линкера : error LNK2005: ** already defined ** ( ** заменены конкретные имена переменных). Понимаю, что директивы не корректны, пересмотрел несколько учебников, не пойму в чем ошибка. Заранее благодарю за ответы.

Приложение:
#ifndef INCLLIB#define INCLLIB 1#include "inclLib.h" //это файл содержащий подключаемые хедеры#endif#ifndef DEFVAR#define DEFVAR 1#include "defVar.h" //это файл с переменными#endif

Обсуждение

Неизвестный
16.11.2007, 09:49
общий
это ответ
Здравствуйте, Комаров Сергей Борисович!

Объявите глобальные переменные в файлах *.cpp:
int glob = 77; // можно определить значение по умолчанию
и т. д.

А в файлах *.h используйте ключевое слово extern для этих глобальных переменных:
extern int glob;
и т. д.
Неизвестный
16.11.2007, 10:05
общий
это ответ
Здравствуйте, Комаров Сергей Борисович!

Директива include просто вставляет в файл, где она появляется содержимое файла-аргумента. Получается, что у Вас 3 исходных файла cpp, во всех тех объявлены Ваши переменные. Компилятор, обрабатыавая уже второй файл, совершенно справедливо скажет, что такие переменные уже определены в первом.

Как верно заметил Vas177, глобальные переменные объявляются один раз в cpp-файле (можно, конечно и в хэдере, если он подключается только один раз, но все-равно плохой тон), а для доступа к ним из других можно использовать ключевое слово extern, которое говорит, что такая переменная должна быть объявлена где-то в другом модуле (если компоновщик нигде ее не найдет, скажет Unresolved external ...).
Форма ответа