C/C++界隈のどうでも良い論争の1つに、インクルードガードの代わりに#pragma onceを使うか、というのがある。 結論から言うと、自分は使っている。

基本的にこの宣言はMSVCが先行したのもあって、Microsoftは推奨の立場であり、Googleは反対の立場を取っている。Cのヘッダを作成したい、ってなった時、Visual Studio(Visual C++)では#pragma onceがデフォルトで生成され、Xcodeではインクルードガードがデフォルトになっている(らしい)。

正直これは宗教論争に近い。というのも割と本当にどっちでもいいから。
なぜ自分が使っているかというと、楽だから。

なんかC/C++はこういう論争は色々あるのが面白い。autoは使うべきかどうか、という議論とか。 ガッツリC++やってる人は使っていることもよく見るけど、UEとかゲーム開発系見ると基本的に禁止の方針が目立ってたりする。自分はC++苦手なのであんまりやらないけど、C#でvarする人なので割りかし使うかもしれないかな。

端的に言うと、これは標準ではないという、ただそれだけが問題であり、実際にサポートしていないコンパイラはほぼないと考えて良い。 自分自身がCを知ったときは既に存在していたので、この話って物凄く長年続いている。常日頃標準化提案があるらしい。

自分は#pragma onceを利用して問題化しているという話を聞いたこともない。結構外国の人とかだと使っている人も見るから、あんまり気にしてない。 それよりも、GCC属性みたいな独自仕様の方が、個人的にはおっかないなあと思ったりする。これこそGCC以外の世界だと動かなかったりとか、あるからね。割とこれもバリバリ使ってるの見るんだけれども。(なぜかというと、スマートポインタっぽいことがやれる為)

では問題になる場合はどうかというと、symlinkを貼っていたり使用ライブラリが重複して組み込まれている場合であって、 要はカオスなプロジェクトや大規模なプロジェクト、標準入力をコードに使っているようなものだと必要になる可能性は高い。ここの判断がコンパイラによって判断が変わる。 しかし、これはつまりcurl作るとか、そういうレベルの話です。そもそも「そんなものを僕は作れない」程度の能力なので、楽な方を選んでいる。ぶっちゃけ、70%くらいの人にとっては割とどうでもいいことではないかと思う。

恐らくビジネスであればインクルードガードの方が良い場合が高いだろう、という、それくらいのことかな、と理解してます。