Arantium Maestum

プログラミング、囲碁、読書の話題

Effective C++勉強メモ: Item 2 #defineは(あまり)使わないようにしよう

Effective C++の第2項目

Cの遺産である#defineを使いたくなるようなケースのほとんどでは、const、enum、inlineといったC++機能で代用できるし代用するべきだ、という主張。あるいは「プリプロセッサよりコンパイラに仕事をさせよう」。

そもそも私はCをあまり使ったことがないので(一通り勉強はしたが・・・)、#defineマクロでプリプロセッサにテキスト置換させたい!という欲求がかなり希薄なので、なぜこの項目がこんな冒頭にあるのか少し違和感がある。やはりMeyersがこの本を書いていた頃はほとんどのプログラマがCからC++に流れてきていたのだろうし、プリプロセッサマクロで黒魔術するのがCプログラマの腕の見せ所!というような風潮でもあったのだろうか。

#defineだとただのテキスト置換なので、スコープやらエラーハンドリングやらの言語サポートが全く受けられない。そんなCプリプロセッサの機能に頼るのは最低限にして(#includeや#ifdefなどは未だに必要)ちゃんと言語サポートのあるC++機能を優先的に使っていく方がいい。

定数はconst、あるいは特殊なケースではenum。Integral型のconstの場合、例えばクラスメンバの配列のサイズ定義などにも使えるとのこと。

#defineで関数めいたものを定義したい、というようなケースでは、inline化される関数テンプレートを使うべき。

正直この項目に対する感想は「そうだよな、#define使いたくないよな」とひたすら頷くのみである。