![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
maxim1000 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 1 Всего: 110 |
Модераторам: может, выделить обсуждение #pragma once в свою тему? А то уже, ИМХО, оффтопик пошёл, но пообсуждать интересно
![]()
во-первых, насколько я знаю, #pragma once не является чем-то стандартизированным а это значит, что каждая реализация, которая её реализует, реализует её в своём понимании поэтому "всё остальное - детали реализации" звучит несколько странно: #pragma once целиком - деталь реализации во-вторых она попросту не может гарантировать семантику #ifndef-#define-#endif, т.к. у неё недостаточно информации чётко ответить на вопрос "являются ли файлы одинаковыми?" а если быть более точным - "нужно ли для заданной пары заголовков оставлять только один?" небольшой пример: у меня установлен VC++2005 Express, на нём я попробовал такое: создал проект в его директории создал ещё одну qqq и создал три файла: main.cpp:
aaa.h (в директории проекта)
qqq/aaa.h
при компиляции получил ошибку двойного определения "x" судя по этому, VC++ сравнивает файлы по их полному имени (с путём) значит, эти два файла для неё - разные однако, вполне возможна такая ситуация, окгда программист будет таскать с собой, к примеру, какой-нибудь файлик с нужными вещами, который он использует везде, а когда начнёт объединять какие-то два проекта, полезут ошибки зато если бы использовались #ifndef AAA_H_ #define AAA_H_ ... #endif, никаких ошибок не было бы -------------------------------- конечно, можно возразить: "ну не знаю, что там VC++, вот мой компилятор в даном случае будет считать их одним файлом" это чудесно, но та же ситуация могла бы случиться, когда эти файлы семантически разные, например, какой-нибудь config.h в разных поддиректориях может конфигурировать разные части программы в данном случае уже ошибётся компилятор, который будет считать, что они одинаковые потому я и говорю - на данный момент нет достаточного инструментария, чтобы создать полностью автоматическую #pragma once... впрочем, насколько я слышал, в следующем стандарте предполагаются движения в эту стороны, и я более чем уверен, что простым добавлением ключевого слова дело не ограничится... -------------------- qqq |
||||||||
|
|||||||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
Понимаю. Но я тоже не знаю, как особо ужать. Раскрыть тему желательно полнее, чтобы не оставалось вопросов по теме. Хм... ну не знаю. Мне так не кажется. Камрады, что скажете? Оставлять/убирать? |
|||
|
||||
archimed7592 |
|
||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Здесь обсуждайте - полезнее для статьи. Убирать не нужно. Возможно, что стоит перефразировать, если сможете придумать как(у меня идей нет) ![]()
Если файлик общий, то его нужно выделить в одно место(общее для обоих проектов), что даст явные преимущества и, в том числе, не будет ошибки с сабжевой прагмой. 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 |
||||
|
|||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 1 Всего: 110 |
так я сразу написал, что при более-менее логичной структуре файлов проекта и их имён больших проблем быть не должно но ведь далеко не всегда структура логична особенно объединение двух проектов: далеко не всегда код обоих проектов может контролирвоаться (third party всякие), а эта конструкция добавит кучу ошибок, причин для которых в общем-то нету... P.S. всё это было к тому, что, может, стоит добавить какое-то предупреждение о возможных проблемах ![]() -------------------- qqq |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Возможно, что лучше вообще не упоминать о прагме, либо написать отдельную статью о вреде прагмы и давать в ФАКе ссылочку на описание вреда прагм ![]() -------------------- 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 |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
так... сделано. Ещё замечания будут, или будем выкладывать? |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Думаю, что не будет, но кто их знает ![]() Обожди выкладывать - сейчас у многих выходные. -------------------- 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 |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
Хорошо, "обождеваю" ![]() |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 2 Всего: 207 |
если препроцессор поддерживает #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 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
В данном случае не совсем уникально, ну да ладно ![]() -------------------- 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 |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 2 Всего: 207 |
maxim1000,
+ твой пример не работает не из-за #pragma once замени #pragma once на #ifndef #define #endif у тебя все равно не будет работать ![]() если конечно в #define обоих файлов будет не одинаковый идентификатор + то, что ты показал примером - имхо, неправильно потому что ты из двух физически разных файлов хочешь сделать семантически эквивалентные Добавлено через 1 минуту и 44 секунды в смысле? приведи пример 2-ух разных файлов, для которых NAME будут одинаковые при использовании моего алгоритма -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
/home/user/math.h и /home/usermath.h ![]() -------------------- 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 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
/home/user/include/math.h
и /home/user/include/m/ath.h Добавлено через 18 секунд не успел ![]() Добавлено через 11 минут и 24 секунды как вариант, можно заменять спецсимволы на коды: _<HexCode>:
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 2 Всего: 207 |
archimed7592,
ага согласен но смысл от этого не меняется ввести дополнительные правила тогда будет точно все однозначно ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Да я сразу сказал: ![]() -------------------- 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 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |