td2sk の日記

技術メモとかゲームとか

gccで#pragma onceを使う さらばインクルードガード

今までMS系コンパイラだけの機能だと誤解してた。
gcc(version 3.4以上)でも#pragma onceが使える。だからいちいちインクルードガードを書く必要はない。
pragma once:Wikipedia

ただし、

  • C/C++標準で定められていない独自拡張であり、移植性は期待できない
  • #pragma hogehoge は、hogehogeにtypoがあってもwarningすら出ずに無視される
  • シンボリックリンクがあると正しく動作しないコンパイラがある(gcc3.4など)

移植性に関しては、wikipediaによれば多くのコンパイラでサポートされているようなのでさほど問題にはならないかもしれない。
しかし2番目、onceでのtypoはやばい。そのときは何の問題もなくコンパイルが通っても、ある日突然2重インクルードによるエラーが発生して混乱の元。用いる際は十分注意すること

裏技として、#pragma onceとインクルードガードを両方書くことも可能。
以下wikipediaより

従来のインクルードガードは#ifndefを利用した間接的な方法であるのに対して、#pragma onceは意図が明確。したがってサポートしているコンパイラはより効率よく処理出来る利点がある。
また、コンパイラは理解できないpragmaを無視するので、対応していないコンパイラでも正しく処理でき、移植性が向上する

二つ書いても手間の割にメリットが少ないと思うのは俺だけ?:>
次回はgccでだけ使えるpragmaという誰得特集の予定