2010-12-30 6 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:そうです。私の防衛では、WG21ウェブページの「現在のドラフト」は最新ではありません。 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を使用しています。これはOKですが、うまくいきます。 IMO #pragma onceは単なる良い解決策です。 –

関連する問題