Здравствуйте, Дарней, Вы писали:
Д>если не считать соображений совместимости со старыми копиляторами, которые не поддерживают #pragma once — зачем это может быть нужно?
Именно для этого. К тому же, #pragma once — это нестандартное расширение. Да и что значит "старые компиляторы"?
GCC 3.2.2
1.cpp:1:9: warning: #pragma once is obsolete
Этот компилятор можно назвать старым?
... << RSDN@Home 1.1 beta 1 >>
Re[2]: почему используют #ifndef/#define вместо #pragma once
MAG>Именно для этого. К тому же, #pragma once — это нестандартное расширение. Да и что значит "старые компиляторы"?
MAG>GCC 3.2.2 MAG>
MAG>1.cpp:1:9: warning: #pragma once is obsolete
MAG>Этот компилятор можно назвать старым?
странно — в первый раз слышу, что это нестандартное расширение или устарело. Компиляторы от Metrowerks и M$ не возмущаются. А не подскажешь, где про это можно почитать?
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[3]: почему используют #ifndef/#define вместо #pragma once
Здравствуйте, Дарней, Вы писали:
MAG>>Именно для этого. К тому же, #pragma once — это нестандартное расширение. Да и что значит "старые компиляторы"?
Д>странно — в первый раз слышу, что это нестандартное расширение или устарело.
Устарело оно именно в GCC.
Д> Компиляторы от Metrowerks и M$ не возмущаются. А не подскажешь, где про это можно почитать?
Стандарт C++, разумеется.
Вот еще из MSDN:
The #pragma directives offer a way for each compiler to offer machine- and operating system-specific features while retaining overall compatibility with the C and C++ languages. Pragmas are machine- or operating system-specific by definition, and are usually different for every compiler.
... << RSDN@Home 1.1 beta 1 >>
Re: почему используют #ifndef/#define вместо #pragma once ?
просто-таки "назад в будущее". Сначала одни люди придумывают #pragma once и объявляют #ifdef'ные стражи включения устаревшим способом. Потом другие объявляют прагму устаревшей и возвращаются к #ifdef, потому что не все производители компиляторов потрудились включить ее поддержку (а какие, кстати? я таких не видел). Неисповедимы пути......
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[5]: почему используют #ifndef/#define вместо #pragma once
Здравствуйте, Дарней, Вы писали:
Д>просто-таки "назад в будущее". Сначала одни люди придумывают #pragma once и объявляют #ifdef'ные стражи включения устаревшим способом. Потом другие объявляют прагму устаревшей и возвращаются к #ifdef, потому что не все производители компиляторов потрудились включить ее поддержку (а какие, кстати? я таких не видел). Неисповедимы пути......
BCB
... << RSDN@Home 1.1 alpha 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: почему используют #ifndef/#define вместо #pragma once ?
Здравствуйте, Дарней, Вы писали:
Д>если не считать соображений совместимости со старыми копиляторами, которые не поддерживают #pragma once — зачем это может быть нужно?
ну, например, для проверки включения того или иного хидера:
в начале header.h
#ifndef __ATLCTRLS_H__
#error header.h что же ты гад такой не подключил atlctrls.h!!!!
#endif
Думайте сами, решайте сами...
Re[2]: почему используют #ifndef/#define вместо #pragma once
T>#ifndef __ATLCTRLS_H__
T> #error header.h что же ты гад такой не подключил atlctrls.h!!!!
T>#endif
T>
а почему бы самому не включить в свой файл этот хэдер, если он так сильно нужен?
Очень раздражает, когда включаешь файл — а он требует другой, включишь этот другой — он еще один требует.
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re: почему используют #ifndef/#define вместо #pragma once ?
От:
Аноним
Дата:
01.07.03 04:07
Оценка:
Здравствуйте, Дарней, Вы писали:
Д>если не считать соображений совместимости со старыми копиляторами, которые не поддерживают #pragma once — зачем это может быть нужно?
#ifdef
#define
#endif
Стражи включения(include guards).
"Идея подхода с несколькими заголовочными файлами состоит в том, чтобы предоставить каждый логический модуль в виде согласованного, самодостаточного фрагмента. С точки зрения программы в целом многие объявления, необходимые для обеспечения завершенности каждого логического модуля, избыточны. В больших программах подобная избыточность может привести к ошибкам, так как заголовочный файл, содержащий определение класса или встроенной функции, может быть дважды включен."
Евангелие от Стpаyстpyпа (9.3.3 page 261 special edition ru)
Re[3]: почему используют #ifndef/#define вместо #pragma once
Здравствуйте, Дарней, Вы писали:
Д>странно — в первый раз слышу, что это нестандартное расширение или устарело.
Ты лучше скажи, почему ты считал, что это стандартное свойство языка С++.
Д>Компиляторы от Metrowerks и M$ не возмущаются. А не подскажешь, где про это можно почитать?
Best regards,
Андрей Тарасевич
Re[2]: почему используют #ifndef/#define вместо #pragma once
А>Стражи включения(include guards).
А>"Идея подхода с несколькими заголовочными файлами состоит в том, чтобы предоставить каждый логический модуль в виде согласованного, самодостаточного фрагмента. С точки зрения программы в целом многие объявления, необходимые для обеспечения завершенности каждого логического модуля, избыточны. В больших программах подобная избыточность может привести к ошибкам, так как заголовочный файл, содержащий определение класса или встроенной функции, может быть дважды включен."
Евангелие от Стpаyстpyпа (9.3.3 page 261 special edition ru)
никто и не оспоривает необходимость стражей включения, собственно. Что дальше то?
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[4]: почему используют #ifndef/#define вместо #pragma once
АТ>Ты лучше скажи, почему ты считал, что это стандартное свойство языка С++.
я не лазил специально в стандарт, чтобы проверить — если ты к этому ведешь.
Просто я не встречал компиляторов, где это не поддерживается — потому и думал.
Уверен, что можно найти компилятор, который напрочь не поддерживает шаблоны. Но можно ли это считать поводом объявить устаревшими шаблоны и радостно переделывать всё под макросы?
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[5]: почему используют #ifndef/#define вместо #pragma once
Здравствуйте, Дарней, Вы писали:
АТ>>Ты лучше скажи, почему ты считал, что это стандартное свойство языка С++.
Д>я не лазил специально в стандарт, чтобы проверить — если ты к этому ведешь. Д>Просто я не встречал компиляторов, где это не поддерживается — потому и думал.
Стандартное — это по определению описанное в стандарте.
... << RSDN@Home 1.1 beta 1 >>
Re[6]: почему используют #ifndef/#define вместо #pragma once
Здравствуйте, Дарней, Вы писали:
Д> если не считать соображений совместимости со старыми копиляторами, Д> которые не поддерживают #pragma once — зачем это может быть нужно?
Постановка должна быть как раз обратной: а зачем нужна #pragma once, если есть стандартные
средства (#ifndef/#define)? "Обычный" ответ заключается в том, что #pragma once "быстрее,
т.к. позволяет не открывать подключаемый заголовок после первого включения". Этот ответ
не верен, т.к. существуют техники, позволяющие использовать ту же оптимизацию и для
#ifndef/#define. Более того, в некоторых случаях #pragma once не может быть реализована
в принципе. Например, подключение заголовков через различные сетевые алиасы (не все системы
позволяют определить один ли и тот же файл открывается, или разные).
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: почему используют #ifndef/#define вместо #pragma once
Здравствуйте, Михаил Трухманов, Вы писали:
МТ> А я думал у #pragma once есть более важное св-во -- она исключает МТ> возможность ошибки (случайное дублироваение). Разве не так?
В простых случаях — так, зато в сложных (сетевые алиасы) она эту ошибку замаскирует.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: почему используют #ifndef/#define вместо #pragma once