8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

勉強記録 5日目 〜#defineより、constを使おう〜 - Effective C++ 第3版 -

Posted at

# はじめに

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を用いて定数を宣言したときのサンプルコードを示します。

サンプルコード

intro_default_constructor4.cpp
#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;
}

実行結果

2_define.png

参考文献

https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0

8
6
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?