Традиционно стандартным и переносимым способом избежать включения нескольких заголовков в C ++ было использование #ifndef - #define - #endif
схемы директив предварительного компилятора, также называемой схемой защиты от макросов (см. Фрагмент кода ниже).
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif
Однако в большинстве реализаций / компиляторов (см. Рисунок ниже) существует более «элегантная» альтернатива, которая служит той же цели, что и вызванная схема защиты от макросов #pragma once
. #pragma once
имеет несколько преимуществ по сравнению со схемой защиты от макросов, в том числе меньший объем кода, предотвращение конфликтов имен и иногда повышенная скорость компиляции.
Проведя небольшое исследование, я понял, что хотя #pragma once
директива поддерживается почти всеми известными компиляторами, есть неясность в отношении того, #pragma once
является ли директива частью стандарта C ++ 11 или нет.
Вопросы:
- Может ли кто-нибудь уточнить,
#pragma once
является ли директива частью стандарта С ++ 11 или нет? - Если он не является частью стандарта C ++ 11, есть ли планы по его включению в более поздние версии (например, C ++ 14 или новее)?
- Также было бы неплохо, если бы кто-то мог более подробно рассказать о преимуществах / недостатках использования любого из методов (например, макрозащиты по сравнению с
#pragma once
).