Попала ли `#pragma once` в C ++ 0x?

Название говорит само за себя. #pragma once были стандартизированы для C ++ 0x? Я не знаю компилятора, который бы не реализовал его, почти всегда с той же семантикой и именем.


person Klaim    schedule 30.12.2010    source источник
comment
См. Здесь Попался в #pragma once   -  person Motti    schedule 30.12.2010
comment
Почти? Вы можете использовать его в разных компиляторах, которые не относятся к нему одинаково? Или под какими еще именами вы его знаете? (Непонятно, к какому из них подходит почти что, или к обоим?)   -  person Fred Nurk    schedule 01.01.2011


Ответы (3)


Все директивы #pragma заставляют реализацию вести себя так, как это определено реализацией.

Это не изменилось между C ++ 03 и последним черновиком C ++ 0x (n3225.pdf). Включая охранники - портативная альтернатива.

person CB Bailey    schedule 30.12.2010
comment
Я знаю, что охранники - портативная альтернатива, но я подумал, что в любом случае их можно было бы стандартизировать. - person Klaim; 30.12.2010
comment
Обратите внимание, что последний черновик - n3225.pdf. - person Prasoon Saurav; 30.12.2010
comment
@Prasoon: Так оно и есть. В свою защиту, текущий проект на веб-странице WG21 устарел. open-std.org/jtc1/sc22/wg21 - person CB Bailey; 30.12.2010
comment
Хорошо, #pragma once может вызвать проблемы, но мне интересно - почему бы не рассмотреть другие альтернативы, например #pragma once ID, с указанным пользователем идентификатором? Или мне только противны эти скопированные строки ifdef-define-endif? .. - person Roman L; 30.12.2010
comment
Если какой-то тип #pragma однажды станет стандартом, это не заставит вас использовать его во всех файлах, поэтому я не вижу проблемы с добавлением его в стандарт (кроме присвоения ему имени, отличного от прагмы). - person Klaim; 31.12.2010
comment
@Klaim: В основном потому, что это совершенно не нужно добавлять в язык. Это уже можно сделать с помощью функций, уже имеющихся в языке. - person Mooing Duck; 09.04.2015

Компилятор Sun C ++ (Solaris) не поддерживает его. И нет, это не в черновиках C ++ 0x.

person zeuxcg    schedule 30.12.2010

Это также тривиально реализовать с помощью #ifdef. Каков руководящий принцип для новой версии? Реализовать все, что вам может понадобиться, включая кухонную раковину, или просто дать вам минимум инструментов, чтобы сделать это самостоятельно?

person Jay    schedule 30.12.2010
comment
Вы упускаете суть. Большая часть сандардизации состоит в том, чтобы сделать обычную практику минимально доступным для стандартных инструментов. Поскольку #pragma once IS предоставляется многими компиляторами и зарекомендовал себя как полезный. Было бы полезно использовать стандартизованный эквивалент ключевого слова. - person Klaim; 30.12.2010
comment
include guards заставляет вас выбирать имена в (единственном и единственном глобальном) пространстве имен препроцессора. это боль. Конечно, большинству проектов нужны макросы где-то, поэтому они решают проблему выбора идентификаторов препроцессора, в любом случае не вызывая коллизий. тем не менее, это неприятно, и я все еще вижу много летающего кода #ifdef FILENAME_H. что есть ARGH. большинство разумных проектов используют PROJECTNAME_FILENAME_SOMESUFFIX, что нормально, но хорошо .... IMO #pragma once - лучшее решение. - person Paul Groke; 24.05.2012