![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Guest |
|
||||
|
Unregistered |
Привет, All!
разъясните правило размещения #include у меня при таком размещениии выдает ошибку компиляции:
а при таком компилится нормально:
|
||||
|
|||||
| Darhazer |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 28.9.2005 Где: HellCity (Sofia, Bulgaria) Репутация: 2 Всего: 29 |
Наверника у тебя просто в .h нет защита от повторного include-дa
При этом получаеться в первом случае
рекурсивний include! Во втором случае у тебя просто у каждий .cpp
Чтоб неполучаться рекурсивний 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 |
||||||||
|
|||||||||
| Dark Elf |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 26.12.2003 Где: Брисбен Репутация: 9 Всего: 10 |
Используй #ifdef и #ifndef (или в коде file1.h и в коде file2.h ставь в самом начале #pragma once)
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
я семеркой пользуюсь, там при создании класса #pragma once автоматом выставляется в начале хедера (#pragma once стоит в начале всех хедеров) или её ещё и в cpp'ишник пихать нужно
может какой флаг не выставлен? |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
#pragma once и #if/#endif не для этого предназначены.
Так делать нельзя. Препроцессор заменяет #include на содержимое подключаемого файла. Когда препроцессор парсит file1.h, он натыкается на #include и пытается подставить вместо него содержимое file2.h. Во время разбора file2.h он натыкается опять на #include, но вставить файл в сам себя препроцессор не может, на что и жалуется. Добавлено @ 14:33 Нет, я ошибся. Фокус со стражами включения здесь помогает. -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
[/b]srd[/b] а #pragma once часом не мелкософтская фишка ? т.е сработает нод *nix ами ?
-------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
В gcc #pragma once - deprecated.
Я обычно использую оба варианта
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
НАРОД, я конечно рад что вас так затронула данная тема, но всеже, позвольте вернуться к изначальному вопросу, почему подобное поведение проявляется и при #pragma once в начале каждого хедера?
надеюсь на конкретные ответы, спасибо |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
А хамить зачем? Для того минимума информации, который ты предоставил, ответ Darhazer был исчерпывающим. Если у тебя по прежнему лезут ошибки, то показывай код и текст ошибок. Телепатов тут нет.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Guest |
|
||||
|
Unregistered |
уважаемый srd где в моем вопросе вы увидели грубость?
будь вы хоть и телепатом но я слабо представляю как можно выложить настройки VS в форум, а у меня все больше складывается ощущение что проблема в них а исходники, в интересующем нас фрагменте описаны в самом начале топика, могу повторить (с небольшим уточнением):
|
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Рекурсивное вложение файлов запрещено в любом случае, какие прагмы не ставь.
И вообще, это ОЧЕНЬ ПЛОХОЙ СТИЛЬ! Есть простое правило - если заголовочный файл можно не включать - его НЕ НУЖНО включать (в другой заголовочный файл). Есть весьма ограниченный перечень случаев, когда это действительно необходимо, и когда нельзя обойтись forward declarations, ну и иногда (в локальных случаях) это удобно, и можно уступить собственной лени. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |