constを使用して定数として定義するプログラムを目にするのですが、なぜ定義するのでしょうか?
必要とあればその都度かけば良いものではないのでしょうか?(今回だったら500って書けば良い)
constを使う意味をサンプルコード共に教えてくださるとありがたいです。
constの使い道が分かりません!
Re: constの使い道が分かりません!
Google君に「C マジックナンバー」と聞いてみたら、
「次のような理由で、マジックナンバーはプログラム中に含まれないことが好ましいとされる。
・その数値の持つ意味がわかりづらい。
・数値を変更する場合に、複数の箇所を変更しなければならない可能性がある。 」
という答えが得られました。
そして、その探しだした500という値は本当に変更していいんでしょうか?(別の意味かもしれない)
「次のような理由で、マジックナンバーはプログラム中に含まれないことが好ましいとされる。
・その数値の持つ意味がわかりづらい。
・数値を変更する場合に、複数の箇所を変更しなければならない可能性がある。 」
という答えが得られました。
まさにマジックナンバーを避けるために定数を定義するんです。まるまる6734 さんが書きました:constを使用して定数として定義するプログラムを目にするのですが、なぜ定義するのでしょうか?
500という値を変更したい時、プログラム中にある500を全部探し出して変更するのでしょうか?(まあエディタがやってくれるので手間はかかりませんが)まるまる6734 さんが書きました:必要とあればその都度かけば良いものではないのでしょうか?(今回だったら500って書けば良い)
そして、その探しだした500という値は本当に変更していいんでしょうか?(別の意味かもしれない)
Re: constの使い道が分かりません!
オフトピック
#defineの使用例をafx.h(MFC)より一部引用
#ifdef _AFXDLL
#define DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static const CRuntimeClass class##class_name; \
static CRuntimeClass* PASCAL GetThisClass(); \
virtual CRuntimeClass* GetRuntimeClass() const; \
#define _DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static CRuntimeClass class##class_name; \
static CRuntimeClass* PASCAL GetThisClass(); \
virtual CRuntimeClass* GetRuntimeClass() const; \
#else
#define DECLARE_DYNAMIC(class_name) \
public: \
static const CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
#define _DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
#endif
Re: constの使い道が分かりません!
const の使い道ですか?
まず、マジックナンバーを避けるためというのがあります。
でも、マジックナンバーを避けるために const が必要でしょうか?
int XXX = 500; または #define XXX 500 としても、
マジックナンバーは回避できます。
次の例では const を付けない int は良くないことになります。
マジックナンバーを回避するには #define が一番いいように思えます。
ヘッダファイルに記述して、複数のファイルからインクルードされても
エラーになりません。
複数のファイルに const int XXX = 500; があると、
C++ ではエラーになりませんが、C では多重定義のエラーです。
const が #define よりいいところは、
変数と同様に、スコープを局所的にできるとか、
単項&演算子でアドレスを取得できるところでしょうか。
まず、マジックナンバーを避けるためというのがあります。
でも、マジックナンバーを避けるために const が必要でしょうか?
int XXX = 500; または #define XXX 500 としても、
マジックナンバーは回避できます。
次の例では const を付けない int は良くないことになります。
int XXX = 500;
char buf[XXX]; // C:*, C++:エラー
const int XXX = 500;
char buf[XXX]; // C:*, C++:OK
#define XXX 500
char buf[XXX]; // C:OK, C++:OK
*: C99 の可変長配列をコンパイラが実装していると OK、そうでないとエラー
ヘッダファイルに記述して、複数のファイルからインクルードされても
エラーになりません。
複数のファイルに const int XXX = 500; があると、
C++ ではエラーになりませんが、C では多重定義のエラーです。
const が #define よりいいところは、
変数と同様に、スコープを局所的にできるとか、
単項&演算子でアドレスを取得できるところでしょうか。