2

C++ で複雑な定数 "i" を定義するための "ベスト プラクティス" とは何か疑問に思っています。

#define「 vs constin C++」という質問が何度も出されていることを知っています。一般的な答えは、使用するのが最善であるということです。const.

ただし、数学定数 (「i」や「pi」など) を変数#defineとしてではなく「絶対定数」(受け入れられたここで答えてください。「const修飾子で定義された定数は、変更不可能な変数と考えるのが最善です」)。また、ライブラリでは、定数がこのように定義されていることがわかります。const math.h#define M_E 2.71828182845904523536028747135266250 /* e */

C++ プログラマーは通常、複雑な定数 i をどのように定義するのでしょうか?

最後に、現在のコードに小さな問題があります#define I std::complex<double>(0.0, 1.0)。プリコンパイルにより、使用している Qt ライブラリと名前が競合します (C++11 サポートを有効にするとすぐに)。

4

1 に答える 1

2

ベスト プラクティスは、固有の名前または名前空間で static const インスタンスを宣言することです。


あなたは数学定数を定義#defineしていません。に展開されるマクロを定義しstd::complex<double>(0.0, 1.0)ます。なぜ違うのですか?

1. 範囲

コンパイラが と呼ばれるトークンを見つけるたびに、Iそれが変数名であるかどうかにかかわらず、置き換えられます。型名、テンプレート パラメーター、変数、関数の引数のいずれであっても、置き換えられます。プリプロセッサはそれらを理解しないため、名前空間にあるかどうかは問題ではありません。このブレーク Qt は既に見たとおりです。これがまさに、マクロが一般的に定数を宣言することを推奨されない理由です。

それら使用される場所では、名前が一意であることを確認することが重要ですが、これを行う簡単な方法はありません.

2. セマンティクス

静的定数変数 (つまり、名前に関係なく変化しないもの) を宣言すると、その型のインスタンスと同じように使用できます。また、スマート オプティマイザは、おそらくグローバルのロードを回避できます。ただし、マクロは、参照されるたびに新しい匿名一時を宣言します。重複したインスタンスを除外できない場合が少なくともいくつかあります。

于 2013-08-18T17:12:46.503 に答える