Russian Qt Forum
Ноябрь 15, 2024, 10:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Голосование
Вопрос: Как вы реализуете защиту хедера от множественного включения?
через #ifndef - 18 (90%)
через #pagma once - 2 (10%)
другой способ - 0 (0%)
Всего голосов: 10

Страниц: [1]   Вниз
  Печать  
Автор Тема: #ifndef или #pragma once?  (Прочитано 5906 раз)
yarick
Гость
« : Апрель 23, 2013, 10:00 »

Самый старый и проверенный способ защиты заголовков от повторного включения - через #ifndef. Однако он слишком большой, неудобный - да и при переименовании имя класса приходится константу переименовывать.
Есть более удобный и быстрый (как в плане написания, так и компиляции) способ - использовать #pragma once. Он поддерживается самыми основными компиляторами, хотя и не входит в стандарт.

Я переделал свой проект из #ifndef в #pargma once. Однако заглянул в исходники Qt 4.8 - там почему-то используется первый способ... Должны быть какие-то причины на это!
Записан
Странник
Гость
« Ответ #1 : Апрель 23, 2013, 10:05 »

Однако заглянул в исходники Qt 4.8 - там почему-то используется первый способ... Должны быть какие-то причины на это!
причина как раз таки в "нестандартности" этого метода, полагаю. поскольку Qt собирается на большом числе платформ с использованием различных компиляторов, использовать возможности, не прописанные в стандарте, недальновидно.
Записан
mutineer
Гость
« Ответ #2 : Апрель 23, 2013, 10:06 »

В вики со ссылкой на gcc.gnu.org пишут что прагма устаревшая и не стоит ее использовать
Цитировать
`#pragma once' is now obsolete and should not be used at all

Как по мне так ее проблема в том, что она не стандартная, соответственно не всеми компиляторами поддерживается. А менять привычку от компилятора к компилятору мне лично не хочется
Записан
Bepec
Гость
« Ответ #3 : Апрель 23, 2013, 10:32 »

Меня вымораживают такие вот махинации. Когда посылают тебе проект, а он раз - и не собирается Веселый Раз - и не работает. И говорят - а что, вы разве не используете %названиеКомпилятора%??? Улыбающийся
Записан
yarick
Гость
« Ответ #4 : Апрель 23, 2013, 10:35 »

Устаревшей эта конструкция давно уже не является, хотя, насколько я понял, когда-то её объявили устаревшей но потом отменили это
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Апрель 23, 2013, 11:03 »

Встречал ещё и такое Улыбающийся
Код
C++ (Qt)
#ifdef VISUAL_STUDIO_COMPILER
#define PRAGMA_ONCE "#pragma once"
#else
#define PRAGMA_ONCE
#endif
 

Мне лично удобнее #pragma once пользоваться. Но ведь нестандрат... Приходиться ifdefить.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.141 секунд. Запросов: 25.