почему используют #ifndef/#define вместо #pragma once ?
От: Дарней Россия  
Дата: 30.06.03 04:01
Оценка:
если не считать соображений совместимости со старыми копиляторами, которые не поддерживают #pragma once — зачем это может быть нужно?
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re: почему используют #ifndef/#define вместо #pragma once ?
От: m.a.g. Мальта http://dottedmag.net/
Дата: 30.06.03 04:23
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>если не считать соображений совместимости со старыми копиляторами, которые не поддерживают #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
От: Дарней Россия  
Дата: 30.06.03 04:44
Оценка:
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
От: m.a.g. Мальта http://dottedmag.net/
Дата: 30.06.03 05:13
Оценка:
Здравствуйте, Дарней, Вы писали:

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 ?
От: Octane Россия  
Дата: 30.06.03 05:29
Оценка:
Здравствуйте, Дарней, Вы писали:

#ifdef NOVIYKOMPILYATOR
#pragma once
#elif
#ifndef
#define
#endif
#endif

Re[4]: почему используют #ifndef/#define вместо #pragma once
От: Дарней Россия  
Дата: 30.06.03 07:57
Оценка:
MAG>Устарело оно именно в GCC.

просто-таки "назад в будущее". Сначала одни люди придумывают #pragma once и объявляют #ifdef'ные стражи включения устаревшим способом. Потом другие объявляют прагму устаревшей и возвращаются к #ifdef, потому что не все производители компиляторов потрудились включить ее поддержку (а какие, кстати? я таких не видел). Неисповедимы пути......
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[5]: почему используют #ifndef/#define вместо #pragma once
От: WolfHound  
Дата: 30.06.03 13:25
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>просто-таки "назад в будущее". Сначала одни люди придумывают #pragma once и объявляют #ifdef'ные стражи включения устаревшим способом. Потом другие объявляют прагму устаревшей и возвращаются к #ifdef, потому что не все производители компиляторов потрудились включить ее поддержку (а какие, кстати? я таких не видел). Неисповедимы пути......

BCB
... << RSDN@Home 1.1 alpha 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: почему используют #ifndef/#define вместо #pragma once ?
От: Toughpheeckouse Россия  
Дата: 30.06.03 14:00
Оценка: :)
Здравствуйте, Дарней, Вы писали:

Д>если не считать соображений совместимости со старыми копиляторами, которые не поддерживают #pragma once — зачем это может быть нужно?


ну, например, для проверки включения того или иного хидера:

в начале header.h


#ifndef __ATLCTRLS_H__
    #error header.h что же ты гад такой не подключил atlctrls.h!!!!
#endif
Думайте сами, решайте сами...
Re[2]: почему используют #ifndef/#define вместо #pragma once
От: Дарней Россия  
Дата: 01.07.03 03:43
Оценка: 12 (1)
T>
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
От: Андрей Тарасевич Беларусь  
Дата: 01.07.03 08:35
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>странно — в первый раз слышу, что это нестандартное расширение или устарело.


Ты лучше скажи, почему ты считал, что это стандартное свойство языка С++.

Д>Компиляторы от Metrowerks и M$ не возмущаются. А не подскажешь, где про это можно почитать?
Best regards,
Андрей Тарасевич
Re[2]: почему используют #ifndef/#define вместо #pragma once
От: Дарней Россия  
Дата: 01.07.03 12:17
Оценка:
А>

А>Стражи включения(include guards).
А>"Идея подхода с несколькими заголовочными файлами состоит в том, чтобы предоставить каждый логический модуль в виде согласованного, самодостаточного фрагмента. С точки зрения программы в целом многие объявления, необходимые для обеспечения завершенности каждого логического модуля, избыточны. В больших программах подобная избыточность может привести к ошибкам, так как заголовочный файл, содержащий определение класса или встроенной функции, может быть дважды включен."

Евангелие от Стpаyстpyпа (9.3.3 page 261 special edition ru)


никто и не оспоривает необходимость стражей включения, собственно. Что дальше то?
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[4]: почему используют #ifndef/#define вместо #pragma once
От: Дарней Россия  
Дата: 01.07.03 12:23
Оценка:
АТ>Ты лучше скажи, почему ты считал, что это стандартное свойство языка С++.

я не лазил специально в стандарт, чтобы проверить — если ты к этому ведешь.
Просто я не встречал компиляторов, где это не поддерживается — потому и думал.
Уверен, что можно найти компилятор, который напрочь не поддерживает шаблоны. Но можно ли это считать поводом объявить устаревшими шаблоны и радостно переделывать всё под макросы?
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[5]: почему используют #ifndef/#define вместо #pragma once
От: m.a.g. Мальта http://dottedmag.net/
Дата: 01.07.03 12:26
Оценка:
Здравствуйте, Дарней, Вы писали:

АТ>>Ты лучше скажи, почему ты считал, что это стандартное свойство языка С++.


Д>я не лазил специально в стандарт, чтобы проверить — если ты к этому ведешь.

Д>Просто я не встречал компиляторов, где это не поддерживается — потому и думал.

Стандартное — это по определению описанное в стандарте.
... << RSDN@Home 1.1 beta 1 >>
Re[6]: почему используют #ifndef/#define вместо #pragma once
От: Дарней Россия  
Дата: 01.07.03 12:32
Оценка:
MAG>Стандартное — это по определению описанное в стандарте.

стандартный Syn: нормальный, типовой, шаблонный, трафаретный, стереотипный, штампованный


а описанный в стандарте — это стандартизованный, то есть приведенный к единому стандарту.

но у нас тут кажется не обсуждение лингвистических тонкостей, так что не надо придираться к словам.
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re: почему используют #ifndef/#define вместо #pragma once ?
От: Павел Кузнецов  
Дата: 01.07.03 16:44
Оценка: 21 (5)
Здравствуйте, Дарней, Вы писали:

Д> если не считать соображений совместимости со старыми копиляторами,

Д> которые не поддерживают #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
От: Михаил Трухманов Россия  
Дата: 03.07.03 07:57
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

А я думал у #pragma once есть более важное св-во -- она исключает возможность ошибки (случайное дублироваение). Разве не так?
Re[3]: почему используют #ifndef/#define вместо #pragma once
От: Павел Кузнецов  
Дата: 03.07.03 08:28
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ> А я думал у #pragma once есть более важное св-во -- она исключает

МТ> возможность ошибки (случайное дублироваение). Разве не так?

В простых случаях — так, зато в сложных (сетевые алиасы) она эту ошибку замаскирует.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: почему используют #ifndef/#define вместо #pragma once
От: Toughpheeckouse Россия  
Дата: 09.08.03 19:24
Оценка:
Здравствуйте, Дарней, Вы писали:


Д>а почему бы самому не включить в свой файл этот хэдер, если он так сильно нужен?


можно и самому включить, но бывают случаи когда нужно заставлять программиста инклудить нужные файлы.
Например:
твой файл содержит следующий код:

#ifdef _SOMETHING_
    //Some my code
#endif


а в том файле. который нужно включить содержит следующий код:

#ifdef _SOMETHING_
    //bla-bla-bla
#endif


и если фалй включить непосредственно в твой файл, то тогда нельзя будет настраивать отдельно генерацию кода твоего файла и того другого.

Конечно, можно подумать, что пример высосан из пальца, но тем не менее....
Думайте сами, решайте сами...
Re[2]: почему используют #ifndef/#define вместо #pragma once
От: ЖуК Украина http://smart-ip.net/
Дата: 09.08.03 22:38
Оценка: :)
Здравствуйте, Toughpheeckouse, Вы писали:

T>
T>#ifndef __ATLCTRLS_H__
T>    #error header.h что же ты гад такой не подключил atlctrls.h!!!!
T>#endif
T>


Сорри за офф — не удержался

#ifndef __CTRLALTDEL_H__
    #error header.h что же ты гад такой не подключил ctrlaltdel.h!!!!
#endif
_____________________________________________________________
"Голова — кость, поэтому болеть не может..." © Неизвестный автор
Re: почему используют #ifndef/#define вместо #pragma once ?
От: folk Россия  
Дата: 11.08.03 02:37
Оценка:
Интересно, а в чем смысл такого дублирования???

#ifndef BOOST_BIND_HPP_INCLUDED
#define BOOST_BIND_HPP_INCLUDED

#if _MSC_VER >= 1020
#pragma once
#endif

<...>

#endif // #ifndef BOOST_BIND_HPP_INCLUDED
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[2]: почему используют #ifndef/#define вместо #pragma once
От: folk Россия  
Дата: 11.08.03 02:53
Оценка:
Здравствуйте, folk, Вы писали:

F>Интересно, а в чем смысл такого дублирования???


F>
F>#ifndef BOOST_BIND_HPP_INCLUDED
F>#define BOOST_BIND_HPP_INCLUDED

F>#if _MSC_VER >= 1020
F>#pragma once
F>#endif

<...>>

F>#endif // #ifndef BOOST_BIND_HPP_INCLUDED
F>


Перечитал один из ответов ПК и понял — смысл в ускорении компиляции.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.