テンプレートの定義の位置を抑制2013年04月16日 11時41分25秒

-template=no%extdef は Solaris C++ のコンパイルオプション。

テンプレートは C++ の型を指定しない一般型のコードを書く時に用いる。データの大きさなどは、コンパイル時に自動で生成され、各々に適した形になるわけだ。

そのため、多くのコンパイラでは、ヘッダファイルに実装も書く必要がある。各々のファイルをコンパイルするときに、その実装も既に見えていないと、型ごとのコードに変換できないからだ。

Solaris の C++ コンパイラは、テンプレートの宣言があるヘッダーファイルと同じ実装ファイルを探す仕様になっている。例えば、myfunc.h にテンプレート関数の宣言があると、myfunc.cpp や myfunc.cxx、myfunc.CC などのファイルを探し、そこから実装を引っ張ってくる。

多くの場合この機能は便利なのだが、問題もある。例えば、複数の cpp ファイルを同時に開いてしまうので、同じ名前の静的変数が違うファイルにあった時に、コンパイラがエラーを起こす。旧来の C++ の静的変数のスコープは各々の cpp ファイル内だったが、テンプレートの所為で他の cpp ファイルも同時にコンパイルされてしまうからだ。

そんな時に、この動作を抑制するのが -template=no%extdef。これを指定するとヘッダーファイルと各々の cpp ファイルからテンプレートの実装を探すので、その様な問題を回避できる。

違うアーキテクチャへの移植性を考えると常に指定しておいた方が、後々楽になる。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2013/04/16/6778836/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。