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

Поиск:

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


Эксперт
****


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

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



Модераторам: может, выделить обсуждение #pragma once в свою тему? А то уже, ИМХО, оффтопик пошёл, но пообсуждать интересно smile
Цитата(MAKCim @  30.12.2007,  12:01 Найти цитируемый пост)
#pragma once гарантирует семантику #ifndef #define #endif
как он это делает - детали реализации

во-первых, насколько я знаю, #pragma once не является чем-то стандартизированным
а это значит, что каждая реализация, которая её реализует, реализует её в своём понимании
поэтому "всё остальное - детали реализации" звучит несколько странно: #pragma once целиком - деталь реализации

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

небольшой пример:
у меня установлен VC++2005 Express, на нём я попробовал такое:
создал проект
в его директории создал ещё одну qqq
и создал три файла:
main.cpp:
Код

#include "aaa.h"
#include "qqq/aaa.h"
int main()
{
    return 0;
}

aaa.h (в директории проекта)
Код

#pragma once
int x;

qqq/aaa.h
Код

#pragma once
int x;

при компиляции получил ошибку двойного определения "x"

судя по этому, VC++ сравнивает файлы по их полному имени (с путём)
значит, эти два файла для неё - разные
однако, вполне возможна такая ситуация, окгда программист будет таскать с собой, к примеру, какой-нибудь файлик с нужными вещами, который он использует везде, а когда начнёт объединять какие-то два проекта, полезут ошибки

зато если бы использовались #ifndef AAA_H_ #define AAA_H_ ... #endif, никаких ошибок не было бы

--------------------------------
конечно, можно возразить: "ну не знаю, что там VC++, вот мой компилятор в даном случае будет считать их одним файлом"
это чудесно, но та же ситуация могла бы случиться, когда эти файлы семантически разные, например, какой-нибудь config.h в разных поддиректориях может конфигурировать разные части программы
в данном случае уже ошибётся компилятор, который будет считать, что они одинаковые

потому я и говорю - на данный момент нет достаточного инструментария, чтобы создать полностью автоматическую #pragma once...

впрочем, насколько я слышал, в следующем стандарте предполагаются движения в эту стороны, и я более чем уверен, что простым добавлением ключевого слова дело не ограничится...


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


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


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

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



Цитата(Mayk @  30.12.2007,  12:06 Найти цитируемый пост)
Длинная очень.

Понимаю. Но я тоже не знаю, как особо ужать. Раскрыть тему желательно полнее, чтобы не оставалось вопросов по теме.

Цитата(Mayk @  30.12.2007,  12:06 Найти цитируемый пост)
имхо "явно"/"неявно" здесь лишни.

Хм... ну не знаю. Мне так не кажется. Камрады, что скажете? Оставлять/убирать?



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


Архимед
****


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

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



Цитата(maxim1000 @  30.12.2007,  13:02 Найти цитируемый пост)
Модераторам: может, выделить обсуждение #pragma once в свою тему? А то уже, ИМХО, оффтопик пошёл, но пообсуждать интересно smile

Здесь обсуждайте - полезнее для статьи.

Цитата(JackYF @  30.12.2007,  14:08 Найти цитируемый пост)
Камрады, что скажете? Оставлять/убирать?

Убирать не нужно. Возможно, что стоит перефразировать, если сможете придумать как(у меня идей нет) smile.


Цитата(maxim1000 @  30.12.2007,  13:02 Найти цитируемый пост)
а когда начнёт объединять какие-то два проекта, полезут ошибки

Если файлик общий, то его нужно выделить в одно место(общее для обоих проектов), что даст явные преимущества и, в том числе, не будет ошибки с сабжевой прагмой. OTOH, что бы ни говорили, я против использования прагм, когда есть стандартные заменители.


--------------------
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
Дата 30.12.2007, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(archimed7592 @  30.12.2007,  17:38 Найти цитируемый пост)
Если файлик общий, то его нужно выделить в одно место(общее для обоих проектов), что даст явные преимущества и, в том числе, не будет ошибки с сабжевой прагмой.

так я сразу написал, что при более-менее логичной структуре файлов проекта и их имён больших проблем быть не должно
но ведь далеко не всегда структура логична
особенно объединение двух проектов: далеко не всегда код обоих проектов может контролирвоаться (third party всякие), а эта конструкция добавит кучу ошибок, причин для которых в общем-то нету...

P.S.
всё это было к тому, что, может, стоит добавить какое-то предупреждение о возможных проблемах smile


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


Архимед
****


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

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



Цитата(maxim1000 @  30.12.2007,  21:11 Найти цитируемый пост)
P.S.
всё это было к тому, что, может, стоит добавить какое-то предупреждение о возможных проблемах

Возможно, что лучше вообще не упоминать о прагме, либо написать отдельную статью о вреде прагмы и давать в ФАКе ссылочку на описание вреда прагм 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
Дата 3.1.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(maxim1000 @  29.12.2007,  22:19 Найти цитируемый пост)
можно ещё в func_b() добавить параметр point *x, например

так... сделано.

Ещё замечания будут, или будем выкладывать?


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


Архимед
****


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

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



Цитата(JackYF @  3.1.2008,  14:20 Найти цитируемый пост)
Ещё замечания будут, или будем выкладывать? 

Думаю, что не будет, но кто их знает 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
Дата 3.1.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(archimed7592 @  3.1.2008,  14:22 Найти цитируемый пост)
Обожди выкладывать - сейчас у многих выходные. 

Хорошо, "обождеваю" smile


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


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


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

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



Цитата(maxim1000 @  30.12.2007,  13:02 Найти цитируемый пост)
во-первых, насколько я знаю, #pragma once не является чем-то стандартизированным
а это значит, что каждая реализация, которая её реализует, реализует её в своём понимании
поэтому "всё остальное - детали реализации" звучит несколько странно: #pragma once целиком - деталь реализации

если препроцессор поддерживает #pragma once
то значит он каким-то образом реализует семантику #ifndef #define #endif
а уж как - детали реализации в конкретном препроцессоре
нам об этом беспокоится не стоит
поведение будет ожидаемым
как можно реализовать? легко
#pragma once -> #ifndef NAME #define NAME #endif
где NAME - трансформируемый абсолютный путь к текущему заголовочному файлу
т. е для Linux, к примеру, если абсолютный путь к файлу - /home/user/include/math.h
то трансформируемый абсолютный путь - homeuserincludemathh
для Windows, если абсолютный путь - d:\user\include\math.h
то трансформируемый абсолютный путь - duserincludemathh
т. к в одной и той же директории не может быть двух файлов с одинаковым названием, то абсолютный путь уникально трансформируется в NAME


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

PM MAIL   Вверх
archimed7592
Дата 3.1.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(MAKCim @  3.1.2008,  14:57 Найти цитируемый пост)
то абсолютный путь уникально трансформируется в NAME 

В данном случае не совсем уникально, ну да ладно 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   Вверх
MAKCim
Дата 3.1.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



maxim1000
+ твой пример не работает не из-за #pragma once
замени #pragma once на #ifndef #define #endif
у тебя все равно не будет работать
 smile 
если конечно в #define обоих файлов будет не одинаковый идентификатор
+ то, что ты показал примером - имхо, неправильно
потому что ты из  двух физически разных файлов хочешь сделать семантически эквивалентные

Добавлено через 1 минуту и 44 секунды
Цитата(archimed7592 @  3.1.2008,  15:01 Найти цитируемый пост)
В данном случае не совсем уникально, ну да ладно

в смысле?
приведи пример 2-ух разных файлов, для которых NAME будут одинаковые при использовании моего алгоритма


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

PM MAIL   Вверх
archimed7592
Дата 3.1.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(MAKCim @  3.1.2008,  15:08 Найти цитируемый пост)
приведи пример 2-ух разных файлов, для которых NAME будут одинаковые при использовании моего алгоритма 

/home/user/math.h
и
/home/usermath.h
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   Вверх
bsa
Дата 3.1.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



/home/user/include/math.h
и
/home/user/include/m/ath.h

Добавлено через 18 секунд
не успел  smile

Добавлено через 11 минут и 24 секунды
как вариант, можно заменять спецсимволы на коды: _<HexCode>:
Код

/home/user/include/math.h -> HEADER_2Fhome_2Fuser_2Finclude_2Fmath_2Eh
/home/user/include/m_ath.h -> HEADER_2Fhome_2Fuser_2Finclude_2Fm_5Fath_2Eh

PM   Вверх
MAKCim
Дата 3.1.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



archimed7592
ага
согласен
но смысл от этого не меняется
ввести дополнительные правила
тогда будет точно все однозначно
 smile 


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

PM MAIL   Вверх
archimed7592
Дата 3.1.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(MAKCim @  3.1.2008,  17:19 Найти цитируемый пост)
но смысл от этого не меняется

Да я сразу сказал:
Цитата(archimed7592 @  3.1.2008,  15:01 Найти цитируемый пост)
ну да ладно 


 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   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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