C++ Coding Standards: 101 Rules, Guidelines, and Best Practices という本を読んでいますが、使用するの#define
はよくないと書かれています。いくつかのヘッダー ファイルを見ていると、多く#define
の s が含まれています。sを使うのが悪いのなら#define
、なぜそんなにたくさんあるのですか? ありがとうございました。
3 に答える
#define
次の理由により、悪い習慣です。
それらにはスコープがありません:
#define
s はスコープを尊重しないため、クラス スコープの名前空間を作成する方法はありません。変数はクラスでスコープできます。
コンパイルエラー中の奇妙な魔法の数字:
これらを使用している場合は#define
、プリコンパイル時にプリプロセッサによって置き換えられます。したがって、コンパイル中にエラーが発生した場合、エラー メッセージはマクロ名ではなく値を参照し、突然の値が表示されるため、混乱します。コードで追跡するのに多くの時間を無駄にします。
デバッグの問題:
また、#2で述べたのと同じ理由で、デバッグ#define
は実際にはあまり役に立ちません。
したがって、const
の代わりに変数を使用することをお勧めします#define
。
それらは#define
、上記のすべての側面で優れて#define
います。本当に役立つのは、コード内またはインクルード ヘッダー ガードの定義で実際のテキスト置換が必要な場合のみです。
#define
C標準ヘッダーファイルで広く使用されているのはなぜですか?
私の頭に浮かぶ理由の 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;