# はじめに
Effective C++ 第3版の2項3ページから勉強していきます。
今回は、「#defineより、constを使おう」についです。
Effective C++ 第3版 - 2項 #defineより、const, enum, inlineを使おう -
#defineより、constを使おう
#defeineの問題点
#define ASPECT_RATIO 1.653
のように、定数を#defineを用いて宣言したとします。
そうすると、コンパイラが処理する前の段階で、ソース中のASPECT_RATIOが数値に置き換えられます。
その結果、ASPECT_RATIO は、コンパイラが持つシンボル表に登録されなくなります。
そのため、コンパイル中にエラーが出た場合、エラーメッセージには ASPECT_RATIO ではなく 1.653がでてきてしまう。
また、 ASPECT_RATIO がヘッダファイル内で定義されていると、どこで定義されたか分からなくなり、保守管理に向かない。
加えて、変数名の重複の可能性も上がってしまう。
#defineの問題点の解決策
#defineで宣言するマクロよりも、constを用いて定数を宣言しよう。
const double AspectRatio = 1.653;
このように定義したAspectRatioは、言語で規定された定数となり、コンパイラが持つシンボル表に登録されるようになる。
これによって、どこで定義されている何型の変数かが分かるようになる。
疑問点
ASPECT_RATIO = 3;
上のように、コンパイルエラーが起きるようなコードを書いた際、エラー内容は、
error: lvalue required as left operand of assignment
ASPECT_RATIO = 3;
のように警告されました。
注釈に「すべてのコンパイラが同じ振る舞いをするわけではない。」と書かれているため、
ASPECT_RATIO がエラー内容に表示されたのでしょうか。。。
下に#defineとconstを用いて定数を宣言したときのサンプルコードを示します。
サンプルコード
#include <iostream>
#define ASPECT_RATIO 1.653
const double AspectRatio = 1.653;
int main(int argc, char* argv[]) {
std::cout << "2_define.cpp" << std::endl;
// double a = ASPECT_RATIO * 5;
// ASPECT_RATIO = 3;
std::cout << ASPECT_RATIO << std::endl;
std::cout << AspectRatio << std::endl;
}
実行結果
参考文献
・https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0