とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

#pragma once

http://pc11.2ch.net/test/read.cgi/tech/1186262298/

295 名前:デフォルトの名無しさん[] 投稿日:2009/02/12(木) 05:49:25
#ifndef _A_
#define _A_
  :
#endifと、
#pragma onceは同じ意味じゃないの?
316 名前:306[sage] 投稿日:2009/02/14(土) 04:46:01
>>313
マクロによるインクルードガードでは2回目もファイルを開いて少なくともインクルードガードを
読む必要がある。 #pragma once なら2回目以降ファイルを開かずにスキップするような実装が
考えられる。

そのため、インクルードガードを置いて移植性を持たせつつ、特定のコンパイラでの
コンパイル時間を短縮する目的で #pragma once を置くことが考えられる。

http://en.wikipedia.org/wiki/Pragma_once

そっか、コンパイル時間を短縮する実装もありえるのか。それは知らなかった。

321 名前:デフォルトの名無しさん[sage] 投稿日:2009/02/16(月) 22:04:41
>>316
大抵の場合、フルビルドを立て続けにやることはなく、プリコンパイルヘッダの効果で意味がないと思われ

いやん。
追記:
たかぎさんにコメントいただきました。

たかぎ 2009/02/17 01:45 マクロによるインクルードガードでも、正直に字句解析をせずにコンパイル時間を短縮するような実装になっているケースが最近は多いように聞きます。
まあ、それ以前に、細かな話をすると、_A_のような予約済み識別子を使った場合の動作は未定義ですが...。処理系付属のヘッダの話の可能性もありますが、それなら#pragma onceにするかどうかの選択肢はユーザーにはありませんね。

プリコンパイルヘッダ云々については、既存のライブラリのヘッダならよいのですが、ヘッダファイル自体を開発中の場合には当てはまりませんので、いずれにしても効果は期待できます。