Здравствуйте Эксперты! Для ясности вопроса приведу пример с простыми именами файлов: 1.cpp, 1.h, 2.cpp, 2.h и stdafx.h В 1.cpp я подключаю 1.h соответственно. В 1.h я подключаю 2.h В 2.cpp подключаю тоже 2.h Допустим в 2.h прописана глобальная переменная: int var_from_2_h; Мне её нужно использовать в 1.cpp - ликовщик изначально невидит, пока недобавлю строку #include "2.h" Но теперь линковщик пишет, что она уже определена. Вообщем поэксперементировал я со stdafx.h в разных *.h, но так и ненашел нужной комбинации: то выскакивает error C2086: 'var_from_2_h' : redefinition, то error LNK2005: "int var_from_2_h" (?var_from_2_h@@3HA) already defined in 1.obj, то вообще её невидет. Подскажите, пожалуйста, правильный синтаксис с использованием precompiled headers(stdafx.h)
Приветствую Вас, cosinus! Правильнее будет в 1.cpp подключить 1.h (2.h не подключаем), в 1.h добавить строку: extern int var_from_2_h;
Ответ отправлен: 31.01.2003, 05:10 Отправитель: VicSimon Отвечает lunao
Здравствуйте, cosinus! твой header циклически включает сам себя, а следовательно и все переменные и функции, объявленные в нем по нескольку раз. для устранения этого используй директиву #if !defined #endif (см. приложение)
Приложение: Ответ отправлен: 31.01.2003, 08:36 Отправитель: lunao Отвечает vitya
Приветствую Вас, cosinus! Объяви переменную, как static тогда скорее всего линкер перестанет ругаться. Или же используй объявление external и тогда тебе не придется делать include. Ответ отправлен: 31.01.2003, 09:42 Отправитель: vitya Отвечает Yuri Gordienko
Приветствую Вас, cosinus! В каждом твоем *.h файле нужно писать (NAMEFILE_H - уникальная строка), тогда они включаются только один раз, а объявление переменных перенеси в *.cpp
2.h #ifndef NAMEFILE_H #define NAMEFILE_H extern int var_from_2_h; #endif 2.cpp #include "2.h" int var_from_2_h;
Ответ отправлен: 31.01.2003, 10:26 Отправитель: Yuri Gordienko Отвечает PL
Доброе время суток, cosinus! В общем все дело в хедерах! Заметь как делаются хедеры Визардом - там в самом начале идут такие строки #if !defined(AFX_STDAFX_H__6_8F64_6832FC44666A__INCLUDED_) #define AFX_STDAFX_H__6_8F64_6832FC44666A__INCLUDED_ и заканчивается все #endif то есть если макрос не задефайнен => хедер инклудиться первый раз, все его содержимое компиляется (ведь #if команда для препроцессора и разбирается при компиляции) и заодно дефайниться твой уникальный макрос AFX_STDAFX_H__6_8F64_6832FC44666A__INCLUDED_ Вот так вот! Можно использовать еще и следующую препроцессорную директиву #pragma once что также позволит тебе добиться желаемого результата
Ответ отправлен: 31.01.2003, 13:49 Отправитель: PL Отвечает Avl2k
Здравствуйте, cosinus! А при чем здесь собственно precompiled headers? Просто если Вы включаете .h-файл из нескольких файлов, то необходимо применять стандартную C-технику для предотвращения его повторной трансляции. Например: // 2.h #ifndef __2_h #define __2_h int var_from_2_h; #endif Можно также использовать вместо этого #pragma once, но иногда она глючит не по-детски. Или можно заменить определение глобальной переменной в 2.h на объявление (т.е. с ключевым словом extern), а определение поместить в 2.cpp. Кроме того, зачем включать stdafx.h еще и в .h файлах? Достаточно только в .cpp. С уважением, Avl2k. Ответ отправлен: 31.01.2003, 14:13 Отправитель: Avl2k Отвечает Ramzes
Приветствую Вас, cosinus! попроуйте включитъ файл 2.h не в 1.h а в 1.cpp. или другой вариант в 2.h перед оъявлением переменной var_from_2_h доbавъте extern то естъ extern int var_from_2_h; Ответ отправлен: 31.01.2003, 15:46 Отправитель: Ramzes Отвечает baldr
Доброе время суток, cosinus! Действительно, есть такая проблема... :(( Точного решения я сам так и не нашел, приходится в каждом файле проекта, который использует эти переменные, писать extern тип имяпеременной; Что плохо - при каждом изменении типа этой переменной приходится все эти объявления изменять. Сорри, если плохой ответ...
Ответ отправлен: 01.02.2003, 00:04 Отправитель: baldr
Вопрос № 556
Help me! Где взять исходник программы для составления школьных расписаний на Borland C++ Builder?
Доброе время суток, X_@!eX:(! Написать самому. Или на www.download.ru Ответ отправлен: 31.01.2003, 20:02 Отправитель: Jadd Отвечает PL
Добрый день, X_@!eX:(! поисчи school schedule на соусфорже sf.net вроде там коечто нашлось Ответ отправлен: 31.01.2003, 12:56 Отправитель: PL Отвечает Ramzes
Добрый день, X_@!eX:(! предлагаю самый простой вариант - НАПИСАТъ САМОМУ !!! :)) Ответ отправлен: 31.01.2003, 15:51 Отправитель: Ramzes
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.