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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [FAQ] Множественное включение header'ов, Обсуждаем и критикуем статью для FAQ. 
:(
    Опции темы
archimed7592
Дата 29.12.2007, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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




M
archimed7592
Сама статья теперь здесь.

Цитата(JackYF @  29.12.2007,  20:00 Найти цитируемый пост)
Почему так происходит?

Хорошо бы ещё привести в коде оба этапа:
1. когда были включены и a и b.
2. когда снова был включен a(уже из b).


Цитата(JackYF @  29.12.2007,  20:00 Найти цитируемый пост)
Решение:

После описания решения взять код в котором будет уже всё "включено" и построчно закомментировать мол "здесь A_H неопределён и поэтому этот кусок не будет выкинут". Потом показать окончательный код, когда уже всё выкинуто.

Цитата(JackYF @  29.12.2007,  20:00 Найти цитируемый пост)
Некоторые компиляторы С/С++ предоставляют ещё одно решение проблемы.

Какие именно (кроме MSVC).
Хорошо было бы перечислить их. Не обязательно все(если их очень много, в чём я немного сомневаюсь).


В общем и целом всё гут. Молодец smile.

Это сообщение отредактировал(а) archimed7592 - 10.1.2008, 20:37


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 29.12.2007, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(archimed7592 @  29.12.2007,  20:23 Найти цитируемый пост)
Хорошо бы ещё привести в коде оба этапа:
1. когда были включены и a и b.
2. когда снова был включен a(уже из b).

мм... не понял, поясни? прокомментировать инклюды в main.cpp?


Цитата(archimed7592 @  29.12.2007,  20:23 Найти цитируемый пост)
После описания решения взять код в котором будет уже всё "включено" и построчно закомментировать мол "здесь A_H неопределён и поэтому этот кусок не будет выкинут". Потом показать окончательный код, когда уже всё выкинуто.

а... имеется в виду - продемонстрировать работу #include'ов за компилятор?
Цитата(archimed7592 @  29.12.2007,  20:23 Найти цитируемый пост)
Какие именно (кроме MSVC).
Хорошо было бы перечислить их. Не обязательно все

MSVC, Builder, g++. Ещё? Эти я укажу.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 29.12.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(JackYF @  29.12.2007,  20:36 Найти цитируемый пост)
а... имеется в виду - продемонстрировать работу #include'ов за компилятор?

Угумс. Многим это непонятно. В частности, многие считают, что между именем заголовочного файла и именем модуля трансляции есть какая-то магическая связь.
Цитата(JackYF @  29.12.2007,  20:36 Найти цитируемый пост)
MSVC, Builder, g++. Ещё? Эти я укажу.

Укажи обязательно. Насчёт "ещё?" - не знаю, ибо конструкцией этой не пользуюсь smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 29.12.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(archimed7592 @  29.12.2007,  20:39 Найти цитируемый пост)
ибо конструкцией этой не пользуюсь

Я тоже. Но в кодах новичков встречал.

Цитата(archimed7592 @  29.12.2007,  20:39 Найти цитируемый пост)
В частности, многие считают, что между именем заголовочного файла и именем модуля трансляции есть какая-то магическая связь.

Таки да. Хорошо, скоро сделаю.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
JackYF
Дата 29.12.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Сделал.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 29.12.2007, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(JackYF @  29.12.2007,  20:00 Найти цитируемый пост)
компилятор от MS Visual Studio, компилятор от Borland C++ Builder, g++.

компилятор из MS Visual Studio(MSVC), компилятор Borland C++ Builder, компилятор g++ из GCC.

Добавлено через 2 минуты и 32 секунды
Ну а в остальном, как я уже сказал, всё гут. Пускай повисит до "после НГ" - если критики никакой не будет, то добавим в FAQ.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
maxim1000
Дата 29.12.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 1
Всего: 110



можно ещё в func_b() добавить параметр point *x, например
чтобы яснее было, зачем в h-файле может понадобиться включение другого

Добавлено @ 22:28
кстати, касательно #pragma once
надёжен ли он?
ведь далеко не всегда компилятор может автоматически определить, нужно ли два файла считать одинаковыми (я думаю, несложно придумать два примера, отличающиеся только семантикой и требующие разного поведения)
это я к тому, что, может, стоит предостеречь о возможных трудностях, чтобы уменьшить тягу к дурным привычкам smile

Это сообщение отредактировал(а) maxim1000 - 29.12.2007, 22:29


--------------------
qqq
PM WWW   Вверх
JackYF
Дата 29.12.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(maxim1000 @  29.12.2007,  22:19 Найти цитируемый пост)
можно ещё в func_b() добавить параметр point *x, например
чтобы яснее было, зачем в h-файле может понадобиться включение другого

да, можно. Если никто не против, добавляю.

Цитата(maxim1000 @  29.12.2007,  22:19 Найти цитируемый пост)
кстати, касательно #pragma once
надёжен ли он?

Он нестандартен, поэтому не очень рекомендуется к использованию. Другое дело, что насчёт ненадёжности я весьма сомневаюсь - что мешает препроцессору это самое #pragma once тупо преобразовывать в #ifndef...#define...#endif?




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
maxim1000
Дата 30.12.2007, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 1
Всего: 110



Цитата(JackYF @  29.12.2007,  22:47 Найти цитируемый пост)
что мешает препроцессору это самое #pragma once тупо преобразовывать в #ifndef...#define...#endif?

здесь возникает вопрос идентификатора, используемого в #ifndef и #endif
например, может получиться так, что в двух разных местах окажутся два файла с одинаковыми именами
(ситуация не очень правильная, но возможная)
и оба они должны будут использоваться в программе
тогда для них нужно будет использовать разные идентификаторы (ну, можно немного модифицированные)
с другой стороны может оказаться, что на самом деле, это - один и тот же файл, и включать его нужно только один раз
впрочем, файлы с одинаковым содержанием - простой случай, т.к. это легко отследить, и решение использовать одинаковые идентификаторы вполне естественно
однако, их содержание может быть рзаным из-за того, что это - разные версии одного и того же файла
т.е. здесь возможны ситуации, когда без дополнительных знаний не разобраться


--------------------
qqq
PM WWW   Вверх
chipset
Дата 30.12.2007, 10:42 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Все MSVC поддерживают pragma once начиная c  _MCS_VER 1000. ИМХО, pragma once это нормально и нечего всякое старье поддерживать smile  Давайте ещё тогда namespace уберем, их Turbo C++ не держит.

А статья прикольная, +1!


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
bsa
Дата 30.12.2007, 11:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(chipset @ 30.12.2007,  10:42)
Все MSVC поддерживают pragma once начиная c  _MCS_VER 1000. ИМХО, pragma once это нормально и нечего всякое старье поддерживать smile  Давайте ещё тогда namespace уберем, их Turbo C++ не держит.

А статья прикольная, +1!

Что стандарт говорит про #pragma once? Если он ничего говорит, то и использовать не стоит в серьезных проектах, имхо.
PM   Вверх
chipset
Дата 30.12.2007, 11:50 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



А что стандарт говорит по поводу Win32API с ихними FAR поинтерами? smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
MAKCim
Дата 30.12.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(maxim1000 @  30.12.2007,  00:50 Найти цитируемый пост)
здесь возникает вопрос идентификатора, используемого в #ifndef и #endif
например, может получиться так, что в двух разных местах окажутся два файла с одинаковыми именами
(ситуация не очень правильная, но возможная)
и оба они должны будут использоваться в программе

#pragma once гарантирует семантику #ifndef #define #endif
как он это делает - детали реализации



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 30.12.2007, 12:03 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(chipset @ 30.12.2007,  11:50)
А что стандарт говорит по поводу Win32API с ихними FAR поинтерами? smile

WIN32API - это всего лишь библиотека со своими макроопределениями и пр. А не расширения языка. А вот #pragma once - это расширение. Есть гарантия, что оно работает на всех компиляторах поддерживающих текущий стандарт? Нет. Значит рекомендовать к использованию не стоит.
PM   Вверх
Mayk
Дата 30.12.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 3
Всего: 134



Статья полезно, одно но.
Длинная очень. Не знаю как ужать, но читать это сложно.
Можно сэкономить пару строк выкинув func_a и изменив func_b(void) на func( struct point *pt );


Цитата(JackYF @  30.12.2007,  00:00 Найти цитируемый пост)

Описание структуры point, итого, вставится в main.cpp два раза: 1-й раз - явно - при включении файла a.h, второй раз - неявно - при включении файла b.h, так как файл b.h тоже включает в себя содержимое файла a.h.

имхо "явно"/"неявно" здесь лишни.

Цитата(chipset @  30.12.2007,  15:50 Найти цитируемый пост)
А что стандарт говорит по поводу Win32API с ихними FAR поинтерами?

а хто это? помню что в досе ближние от дальных отличались. А вот после препроцессирования
Код

int main(){
    printf("%d\n", sizeof(DWORD FAR * ) );
    printf("%d\n", sizeof(DWORD * ) );
}

в bcc551 получаем что нет никаких FAR поинтеров
Код

* a.cpp 4: */int main(){
/* a.cpp 5: */printf("%d\n", sizeof(DWORD  * ) );
/* a.cpp 6: */printf("%d\n", sizeof(DWORD * ) );
/* a.cpp 7: */}




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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