human
C ++の「constexpr」とマクロの違いは何ですか？それぞれの長所と短所は何ですか？
gpt
マクロは、C ++コンパイラに送信される前に、テキストソースコードにC ++プリプロセッサによって実装されます。「constexpr」は言語自体の一部であり、コンパイル時にコンパイラによって評価されます。

どちらもコンパイル時間定数を定義するために使用できますが、一般に「constexpr」を好む必要があります。これは、範囲内の他の変数と偶発的な名前が競合するなど、C ++プレプロセッサの問題に悩まされないためです。
human
C ++プロセッサが、見つけるのが難しい他の変数と偶発的な名前の競合を作成する例を教えてください。おそらく、「名前空間を使用している」後のライブラリ変数、またはコア関数またはタイプ名に誤って何かを名前を付けた後は？
gpt
偶発的な名前の競合がC ++で発生する方法はいくつかあります。

名前空間を使用して、その名前空間の何かと同じものを誤って名前を付ける。例えば：
名前空間STDを使用。
int vector = 5;//おっと、std :: vectorをオーバーライド！

誤ってローカル変数をグローバル変数や関数と同じように命名します。例えば：
int foo = 5;

void bar（）{
    int foo = 10;//おっと、外側のfooを影にします！
}

誤ってローカル変数をタイプ名と同じように命名します。例えば：
struct foo {...};

void bar（）{
    int foo = 5;//ああ、がらくた、タイプを隠します！
}

これらの種類の競合は、特に大きなコードベースで、または衝突の可能性を高める長い説明的な名前を使用する場合、見つけるのが難しい場合があります。解決策は、あなたの命名とあなたがいるスコープを単に認識し、潜在的な名前の競合について警告できるIDESのようなツールを使用することです。
human
長くはない、説明的な名前は衝突の可能性を *減らす *？彼らが衝突の可能性を高めると思う理由を説明できますか？