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