Заголовочные файлы в С++

Вопросы по языкам программирования Си и С++.
d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Заголовочные файлы в С++

Сообщение d3drm » 16.06.2005 (Чт) 19:11

Совсем замучался... В VB все просто, а тут надо следить, чтобы
переменные не были объявлены несколько раз... А что делать, если
переменные, структуры и константы должны быть использованы в других
модулях?

компилятор ругаеца, когда в два разных модулю подключаешь
заголовочный файл, а что делать, если надо? даже

#ifndef _GENERAL_H_
#define _GENERAL_H_

.....

#endif

не помогает...
ХЎ

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 16.06.2005 (Чт) 19:19

А почему не помогает?? По-моему, все обычно так и делают.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 16.06.2005 (Чт) 19:26

StdAfx.obj : error LNK2005: "struct IDirect3DDevice9 * Device" (?Device@@3PAUIDirect3DDevice9@@A) already defined in iR_Engine.obj

во чо пишет...
ХЎ

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 16.06.2005 (Чт) 20:03

include делаешь только в одном файле, типа stdafx.h
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 17.06.2005 (Пт) 16:00

Объявляешь их спокойно в одном месте, а в другом пишешь extern и повторяешь объявление, но уже без инициализации, если была.
например:
asd.cpp
----------BOF----------
#include "asd.h"
int i = 10;
----------EOF----------

asd.h
----------BOF----------
extern int i;
----------EOF----------

file2.cpp
----------BOF----------
#include "asd.h"
void main()
{
int a = i;
}
----------EOF----------
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 17.06.2005 (Пт) 16:09

что-то не совсем догоняю, но вроде направление правильное.

итак, к примеру, файл one.h, который используется во многих модулях:

// one.h ------
int a = 10;
//------

тогда файлы two.cpp и three.cpp будут иметь такие объявления, типа extern int a;

так? и при этом значения будут сохраняться?
ХЎ

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 17.06.2005 (Пт) 16:23

Да. extern говорит линковщику и компилятору, что переменная объявленна в другом файле и здесь только расширяеться область видимости.

Только если ты сделаешь как написал и в two.cpp и three.cpp сделаешь include "one.h" будет ошибка мультиплей дифинишен.
делаешь one.cpp и в нем
int a = 10;
а // one.h ------
extern int a;
//------

и тогда должно все работать. вроде так :D
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.06.2005 (Пт) 19:51

Igor_123, по-моему ерунду говоришь.
extern-переменные обрабатываются линкером
h-файлы обрабатываются компилятором

d3drm, на самом деле вот как:
в файле one.h не пишешь ничего
в файле two.cpp пишешь int a = 10;
в файле three.cpp пишешь extern int a;

Теперь, если two.obj и three.obj слинковать вместе, то имя a будет ссылаться на одну и ту же переменную.
Изображение

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 18.06.2005 (Сб) 12:52

о, гуд, спасибо! А как быть с типами, которые используются по всем модулям? там extern непоиспользуешь...
ХЎ

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.06.2005 (Чт) 15:31

d3drm писал(а):о, гуд, спасибо! А как быть с типами, которые используются по всем модулям? там extern непоиспользуешь...

Вот именно там и нужны хедеры.

Неужели непонятно, что переменная - это сущность, занимающая место в памяти, а тип - это ничто, существующее только в воображении компилятора? Поэтому и разница в методе их обобществления.
Изображение


Вернуться в С/С++

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList