C++ Coding Standards: 101 Rules, Guidelines, and Best Practices という本を読んでいますが、使用するの#defineはよくないと書かれています。いくつかのヘッダー ファイルを見ていると、多く#defineの s が含まれています。sを使うのが悪いのなら#define、なぜそんなにたくさんあるのですか? ありがとうございました。
3 に答える
#define次の理由により、悪い習慣です。
それらにはスコープがありません:
#defines はスコープを尊重しないため、クラス スコープの名前空間を作成する方法はありません。変数はクラスでスコープできます。
コンパイルエラー中の奇妙な魔法の数字:
これらを使用している場合は#define、プリコンパイル時にプリプロセッサによって置き換えられます。したがって、コンパイル中にエラーが発生した場合、エラー メッセージはマクロ名ではなく値を参照し、突然の値が表示されるため、混乱します。コードで追跡するのに多くの時間を無駄にします。
デバッグの問題:
また、#2で述べたのと同じ理由で、デバッグ#defineは実際にはあまり役に立ちません。
したがって、constの代わりに変数を使用することをお勧めします#define。
それらは#define、上記のすべての側面で優れて#defineいます。本当に役立つのは、コード内またはインクルード ヘッダー ガードの定義で実際のテキスト置換が必要な場合のみです。
#defineC標準ヘッダーファイルで広く使用されているのはなぜですか?
私の頭に浮かぶ理由の 1 つは、C では (C++ とは異なり)const宣言で定数式が生成されないことです。これは、C 標準で可変長配列が導入される前は、次のようなものを記述できないことを意味します。
const int max_val = 100;
int foos[max_val];
Cmax_valではコンパイル時定数ではなく、VLA の配列添え字が導入される前は、コンパイル時定数である必要があったためです。
したがって、代わりにこれを次のように書く必要がありました。
#define MAX_VAL 100
int foos[MAX_VAL];
それがおそらく参照しているのは、定数を定義する古い C の方法です。
#define MAX_SOMETHING 100
int x = MAX_SOMETHING;
これらの定数は型付けされず、文字列置換を使用してその場で展開され、ソースがコンパイルされるとその定義がどこから来たのかが明確でないため、デバッグが難しくなります。
それを行うよりC++の方法は次のとおりです。
const int max_something = 100;
int x = max_something;
これは厳密に型指定された値であるため、必要なすべてのチェックと、必要に応じて適切な変換が行われます。
追加の利点はconst、組織的な目的で値を名前空間とクラスに入れることができることです。A#defineはスコープがグローバルであるため、競合が懸念されます。これは、競合を避けるために厄介な長い名前につながるものです。
との間constでtemplate、C がネイティブに実行しない形式のメタプログラミングを可能にします#define。#importただし、ディレクティブがなくても、古い#ifndef __HEADER_FILE_NAME__ガードを追加して、物事が2回含まれないようにする必要があるため、完全に排除されているわけではありません.
本の大まかな説明はそれほど真実ではありません-#defineマクロなどの場所がありますが、定数を定義するために使用することはお勧めできません
例えば
#define FOO 257
で行う方がよい
const int FOO=257;
#define を使用すると、これは少し奇妙になるため、これにより型チェックが可能になります。
char c=FOO;