4

私の小さな C++ 関数は、単純なタイムアウト値を計算する必要があります。

CalcTimeout(const mystruct st)
{
    return (st.x + 100) * st.y + 200;
}

100 と 200 という数字は後でコードを読むとわかりにくいので、#define を使用したいと思います。しかし、これらの定義はこの関数にのみ必要です。関数内で定義できますか? この方法の利点は次のとおりです。

  • それは非常にローカルな価値観であり、他の誰もそれについて知る必要はありません
  • 使用されている場所に近づくと、意図が明確になり、他の用途がなくなり、ローカル変数のようになります (そうでないことを除いて)。

欠点は、ローカル変数/定数のようなものを定義するのはかなり大雑把な方法ですが、明らかにローカルではありません。

それ以外では、C++ 関数内で #define するのは奇妙でしょうか? ほとんどの場合、ファイルの先頭で #defines を使用します。このような固定のローカルハードコード値を置き換える際に、const変数を使用する方が良いですか?

目的は、コードをより読みやすく/理解しやすくすることです。

4

2 に答える 2

17

マクロを使用して定数を定義しないでください。定数を使用します。

const int thingy = 100;  // Obviously, you'll choose a better name
const int doodad = 200;

return (st.x + thingy) * st.y + doodad;

定数式に展開されるマクロと同様に、これらはコンパイル時の定数として扱うことができます。マクロとは異なり、これらは関数内で適切にスコープされます。

ローカルでのみ使用されるマクロを定義する理由がある場合は、終了後に を使用#undefして削除できます。しかし、一般に、(ここのように) 必要なことを行う言語レベルの構造がある場合は、マクロを避ける必要があります。

于 2013-10-10T18:08:59.190 に答える
3

特にC++では、マクロがその目的で使用されているのを見るのはかなり奇妙です。C++ ではconst、マニフェスト定数を定義するためのマクロを完全に置き換えます。そして、constはるかにうまく機能します。(C では、多くの (またはほとんどの) ケースで固執する必要#defineがありますが、質問には C++ のタグが付けられています)。

そうは言っても、擬似ローカル マクロは C++ で便利な場合があります (特に C++11 より前のバージョンの言語では)。何らかの理由で#defineそのようなマクロを関数の「内部」に置く必要がある場合#undefは、同じスコープの最後でそのマクロを明示的に作成することをお勧めします。(プリプロセッサはスコープをあまり気にせず、「内側」と「外側」を区別できないため、内側の単語を引用符で囲みました。)そうすれば、他のローカル識別子が持つスコープ付きの可視性の動作をシミュレートできます。 「ローカルに」定義されたマクロは、翻訳単位の最後までコードの残りの部分にあふれ出します。

于 2013-10-10T18:13:51.763 に答える