clangでc++コードをコンパイルする方法(解説付き)

小ネタです。

以下のようなC++プログラムがあるとします。一見全く問題なさそうです。

しかし、このプログラムを以下のように clang コマンドでコンパイルすると、コンパイルエラーになります。(Mac 環境)

結論として、clang++コマンドを使ってコンパイルするのが正解です。
clang++ を使うと、無事コンパイルができました。

 
 
 

このまま終わるのは腑に落ちないので、もう少し背景を説明します。

clang と clang++ の違いは、ライブラリのリンク時に C++ のライブラリを呼び出すかどうかという点です。この違いは clang, clang++ コマンドに -v オプションをつけて呼び出すとわかります。

-v オプションをつけて、リンク部分の出力を取り出すと次のようになるはずです。
注目すべき点は、/usr/bin/ld というリンクが実行される部分です。

clang の出力

clang++ の出力

/usr/bin/ld の行を比較すると、clang++ の出力には -lstdc++ という C++ のライブラリがリンクされているのがわかります。一方で、clang の方はこのリンクがありません。

だから、C++ 固有の std::cout, std::ostream::operator<< などが undefined symbol (意味:宣言はあるけど、実装がない)となり、コンパイルエラーになることがわかります。

Posted in: c++ |

More Effective C++ 読書メモ2

本日はリソース管理について学んだ。コンストラクタ中で例外呼ぶなと聞いたことがあったが、部分的にしかコンストラクタが生成されないと、デストラクタが呼ばれないからだったのか。スマートポインタを使えば、メモリリソースの管理がずっと楽になる。可能な限り生ポインタではなく、スマートポインタを使おう。

本では std::auto_ptr だったが、boost::shared_ptr の方が良い。


p.37 – p.54

  • 配置 new: 既に割り当てられたメモリ領域にコンストラクタをロードする
    • new 演算子, operator new, 配置 new
  • 例外
    • 9項:リソースリークを防ぐためにデストラクタを使う
      • スマートポインタを使おう
      • C 風のライブラリでもスマートポインタの実装のようにラップすれば、リソース管理しやすくなる
    • 10項:コンストラクタでのリソースリークを防ぐ(重要)
      • コンストラクタ中で補足されない例外が起こった場合、デストラクタが呼ばれない
      • try-catch でコンストラクタ中に例外を監視し、発生した場合 delete
      • メンバ変数が const 付きの場合、初期化リスト内で初期化するような private 関数を用意
      • 結局、スマートポインタを使えば、上のような private 関数も必要なく、デストラクタは極めてシンプルになる
新訂版 More Effective C++ (AddisonーWesley professional co)
スコット・メイヤーズ
ピアソンエデュケーション
売り上げランキング: 259190

Posted in: c++ |