2014年3月3日月曜日

C++03 からでも始められる C++11

はじめに
ちょっと表題がわかりにくいですが、ようは C++11 の使えない環境でも C++11 使っていこうよ、という話です。が、nullptr とか STL とかそういう話ではないです。

私は個人的なプログラムは Visual Studio 2012/2013 を使って書くことが多いです。
なので、C++11 使えます。(VC++ は C++ Compiler に非ず!とか、C++11 対応微妙とかいうツッコミはなしで…)
gcc も clang も使いますが、C++11 はもちろん使えます。
仕事でも Visual Studio 2012 をメインに使っているので、C++11 使えます。

ただそうでない場合もあります。
組み込み系では C++11 が使えない環境の場合があります。
冒頭で触れた nullptr や STL 相当のものは C++03 環境でも使えるので、積極的に使っていくとよいでしょう。
(boost を使うとより簡単に C++11 相当のことができるようになります。)
しかし、それには限界があって C++03 ではどうしても使えないものがあります。
そこで、少し工夫してもっと C++11 を使っていこうというのが、今回の話です。

C++11 コンパイラーを使う
C++11 コンパイラーを使うようにします!

「いや、使えないから困ってるんだけど…」

ですよねぇ…
すみません。訂正します。
C++11 コンパイラを使って"コンパイル"だけします。
ターゲットバイナリは作れませんが、コンパイルだけでも C++11 の機能が使えるようになります。

ただ単純に、コンパイラを C++11 対応のもに変えてもコンパイルエラーが出ると思います。

環境依存なものは、マクロ定義して誤魔化します。
バイナリを作るのが目的ではないので、コンパイルが通るようにダミー宣言するだけで OK です。
ライブラリは、リンクを行わないので宣言だけで済みます。なので特に何かする必要なし。

その他のエラーもマクロで誤魔化します。

コンパイルだけで得られるもの
さて、C++11 でコンパイルできたからといって動作するものが得られなければ、なんの意味もないように思えますが・・
そうでもありません。

override/final です!

override と final は継承関係に対しての検証機能ですので、コンパイルだけでも意味があります。
基底関数の引数変えたけど、派生先を変更し忘れた!なんてミスともおさらばです。

もちろんコンパイルしかできないので、開発者がローカルで常にチェックするというよりも、
Jenkins などの CI ツールを使って C++11 コンパイルを回すという使い方になると思います。

それでは、よい C++11 ライフを!
※ override/final にも使える機能がないか探しています。情報ある方は教えて下さいm(__)m

0 件のコメント:

コメントを投稿