2010-12-30 2 views
11

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

+1

См. Это для [gotcha in '#pragma once'] (http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard/1946730#1946730) – Motti

+0

« Почти «? Вы отлично используете его в разных компиляторах, которые не относятся к нему одинаково? Или, какие другие имена вы знаете об этом? (Непонятно, к чему относится «почти», или оба?) –

ответ

13

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

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

+1

Я знаю, что охранники - это переносная альтернатива, но я думал, что это может быть стандартизировано в любом случае. – Klaim

+0

Обратите внимание, что последний черновик - n3225.pdf. –

+1

@Prasoon: Так оно и есть. В моей защите «текущий проект» на веб-странице РГ21 не обновляется. http://www.open-std.org/jtc1/sc22/wg21/ –

6

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

+0

+1 для информации. – Klaim

-2

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

+8

Вам не хватает смысла. Большая часть сандалии заключается в том, чтобы сделать обычную практику минимальной для стандартных инструментов. Поскольку '#pragma once' предоставлен множеством компиляторов и оказался полезным. Было бы полезно использовать эквивалент ключевых слов, стандартизованный. – Klaim

+6

включают в себя охранники, которые вынуждают вас выбирать имена в (одном и только глобальном) пространстве имен препроцессора. которая является болью. что большинство проектов нуждаются в макросах где-то, поэтому они имеют дело с проблемой выбора идентификаторов препроцессора, не вызывая конфликтов. тем не менее это боль, и я все еще вижу много кода #ifdef FILENAME_H. который является ARGH. В наиболее разумных проектах используется PROJECTNAME_FILENAME_SOMESUFFIX, который является OKish, но хорошо .... IMO # прагма - это просто лучшее решение. –