Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C / C++

Выпуск № 188
от 03.02.2003, 20:20

Администратор:
Имя: Nick.Box
URL: Информационный ресурс
ICQ: 365124
[censored], [censored]
О рассылке:
Задано вопросов: 561
Отправлено ответов: 1273
Активность: 226.9 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

VicSimon
Статус: Доверительный
Общий рейтинг: 103.71
[Подробней >>]
lunao
Статус: Начальный
Общий рейтинг: 118
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108
[Подробней >>]
 
Yuri Gordienko
Статус: Опытный
Общий рейтинг: 115.25
[Подробней >>]
PL
Статус: Доверительный
Общий рейтинг: 116.88
[Подробней >>]
Avl2k
Статус: Опытный
Общий рейтинг: 125.09
[Подробней >>]
 
Ramzes
Статус: Доверительный
Общий рейтинг: 132.29
[Подробней >>]
baldr
Статус: Профессиональный
Общий рейтинг: 113.68
URL: Сайт об ОС DOS. Всем, кто любит эту ОС!
[Подробней >>]
Jadd
Статус: Профессиональный
Общий рейтинг: 144.11
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 555. Здравствуйте Эксперты! Для ясности вопроса приведу пример с простыми именами файлов: 1.cpp, 1.h, 2... (ответов: 8)
Вопрос № 556. Help me! Где взять исходник программы для составления школьных расписаний на Borland C++ Builder?... (ответов: 3)

Вопросов: 2, ответов: 11


 Вопрос № 555

Здравствуйте Эксперты! Для ясности вопроса приведу пример
с простыми именами файлов:
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)


Приложение:


Вопрос отправлен: 30.01.2003, 20:57
Отправитель: cosinus

[Следующий вопрос >>] [Список вопросов]

Отвечает VicSimon

Приветствую Вас, 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?



Вопрос отправлен: 31.01.2003, 11:34
Отправитель: X_@!eX:(

[Следующий вопрос >>] [Список вопросов]

Отвечает Jadd

Доброе время суток, 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.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (38)
C / C++ (28)
Perl (7)
Delphi (18)
Pascal (24)
Basic / VBA (12)
Java / JavaScript (12)
PHP (8)
MySQL / MSSQL (8)
Пользователю
Windows 95/98/Me (36)
Windows NT/2000/XP (30)
"Железо" (32)
Поиск информации (18)
Администратору
Windows NT/2000/XP (15)
Linux / Unix (13)
Юристу
Гражданское право (9)
Семейное право (6)
Трудовое право (5)
КоАП (4)

Отправить вопрос всем экспертам выбранной рассылки.




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное