Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Incude пересекаются? 
:(
    Опции темы
Guest
Дата 24.10.2005, 13:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет, All!

разъясните правило размещения #include
у меня при таком размещениии выдает ошибку компиляции:
Код

// file1.h
#include "file2.h"
...
// file2.h
#include "file1.h"
...

а при таком компилится нормально:
Код

// file1.cpp
#include "file2.h"
...
// file2.cpp
#include "file1.h"
...

  Вверх
Darhazer
Дата 24.10.2005, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

Репутация: 2
Всего: 29



Наверника у тебя просто в .h нет защита от повторного include-дa
При этом получаеться в первом случае

Код
//file1.h
#include "file2.h"
//--> это транслируеться до
#include "file1.h"
....
//т.е. в результате:
#include "file1.h"
//дефиниция file1.h
#include "file1.h"
//дефиниция file1.h
#include "file1.h"
//дефиниция file1.h
...

рекурсивний include!

Во втором случае у тебя просто у каждий .cpp
Код

#include file1.h
#include file2.h


Чтоб неполучаться рекурсивний include, нужно сделать:

Код

//file1.h

#ifndef __FILE1_H__
#define __FILE1_H__

//сам файл

#endif


Во втором тоже самое, только __FILE1_H__ должен быт уникальном идентификаторе
Тогда не получиться рекурсия и можно сделать так:

Код

// file1.h
#include "file2.h"
...
// file2.h
#include "file1.h"
...


Это сообщение отредактировал(а) Darhazer - 24.10.2005, 13:54


--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
Dark Elf
Дата 24.10.2005, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 26.12.2003
Где: Брисбен

Репутация: 9
Всего: 10



Используй #ifdef и #ifndef (или в коде file1.h и в коде file2.h ставь в самом начале #pragma once)



--------------------
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
Guest
Дата 24.10.2005, 14:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











я семеркой пользуюсь, там при создании класса #pragma once автоматом выставляется в начале хедера (#pragma once стоит в начале всех хедеров) или её ещё и в cpp'ишник пихать нужно

может какой флаг не выставлен?
  Вверх
srd
Дата 24.10.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



#pragma once и #if/#endif не для этого предназначены.
Цитата(Guest @ 24.10.2005, 21:46)

// file1.h
#include "file2.h"
...
// file2.h
#include "file1.h"
...

Так делать нельзя. Препроцессор заменяет #include на содержимое подключаемого файла. Когда препроцессор парсит file1.h, он натыкается на #include и пытается подставить вместо него содержимое file2.h. Во время разбора file2.h он натыкается опять на #include, но вставить файл в сам себя препроцессор не может, на что и жалуется.

Добавлено @ 14:33
Нет, я ошибся. Фокус со стражами включения здесь помогает.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
pablo
Дата 24.10.2005, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



[/b]srd[/b] а #pragma once часом не мелкософтская фишка ? т.е сработает нод *nix ами ?


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
srd
Дата 24.10.2005, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



В gcc #pragma once - deprecated.
Я обычно использую оба варианта
Код

#ifndef FILENAME_H_INCLUDE_
#define FILENAME_H_INCLUDE_

#if _MSC_VER > 1020
#pragma once
#endif

// тут 20 мегабайт кода

#endif /* FILENAME_H_INCLUDE_ */

smile


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Guest
Дата 24.10.2005, 16:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











НАРОД, я конечно рад что вас так затронула данная тема, но всеже, позвольте вернуться к изначальному вопросу, почему подобное поведение проявляется и при #pragma once в начале каждого хедера?


надеюсь на конкретные ответы, спасибо
  Вверх
srd
Дата 24.10.2005, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



А хамить зачем? Для того минимума информации, который ты предоставил, ответ Darhazer был исчерпывающим. Если у тебя по прежнему лезут ошибки, то показывай код и текст ошибок. Телепатов тут нет.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Guest
Дата 24.10.2005, 17:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











уважаемый srd где в моем вопросе вы увидели грубость?

будь вы хоть и телепатом но я слабо представляю как можно выложить настройки VS в форум, а у меня все больше складывается ощущение что проблема в них

а исходники, в интересующем нас фрагменте описаны в самом начале топика, могу повторить (с небольшим уточнением):
Код

// не работающий вариант
// file1.h
#pragma once
#include "file2.h"
...
// file2.h
#pragma once
#include "file1.h"
...


Код

// работающий вариант

// file1.h
#pragma once
...
// file1.cpp
#include "file2.h"
...
// file2.h
#pragma once
...
// file2.cpp
#include "file1.h"
...

  Вверх
Earnest
Дата 25.10.2005, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Рекурсивное вложение файлов запрещено в любом случае, какие прагмы не ставь.
И вообще, это ОЧЕНЬ ПЛОХОЙ СТИЛЬ!
Есть простое правило - если заголовочный файл можно не включать - его НЕ НУЖНО включать (в другой заголовочный файл). Есть весьма ограниченный перечень случаев, когда это действительно необходимо, и когда нельзя обойтись forward declarations, ну и иногда (в локальных случаях) это удобно, и можно уступить собственной лени. smile


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.