web-dev-qa-db-ja.com

C89標準でのM_PIの使用

Cを使用して、定数M_PI(3.14159 ...)にアクセスしようとしています。 math.hヘッダーファイルをインポートしましたが、M_PI定数は未定義のままでした。 StackOverflowを検索したところ、コードに#define _USE_MATH_DEFINESを追加する必要があることがわかりました(以下のサンプルコードを参照)。これは通常のコンパイルでは問題なく動作しますが、私が実行している作業のためにstd=c89フラグを使用してコンパイルできる必要があります。

一部のC89コードからM_PIにアクセスするにはどうすればよいですか?

23
robintw

準拠する標準ライブラリファイルmath.hは必須ではなく、実際には必須ではないデフォルトでM_PIを定義します。このコンテキストでは、「デフォルト」とは、M_PIがコンパイラ固有のトリックによってのみ定義されなければならないことを意味します。

定数を自分で定義するだけです(M_PIという名前を自由に使用できますが、非準拠コンパイラでコードをコンパイルできるようにするには、最初にM_PIが定義されていないことを確認する必要があります)。慣例のために、M_PIをpi(の近似)以外のものとして定義しないでください。

38
eq-

私は行きます

#ifndef M_PI
#    define M_PI 3.14159265358979323846
#endif
25
Sven Marnach

M_PIはC標準では必須ではありません。これは単なる共通の拡張であるため、標準になりたい場合はそれに依存しないでください。ただし、独自の#defineを簡単に定義することができます。前回確認したとき、それが汎用定数であることを確認したので、混乱する余地はあまりありません。 :)

9
Matteo Italia

ここで何が問題なのかわかりません。 -std = c89と_USE_MATH_DEFINESの間に互換性はありません。1つはコンパイラーがコンパイルする言語を定義し、もう1つはmath.hのどの部分を有効にするかを定義します。

有効になっている部分は、ISO C標準libraryの一部として定義されていませんが、標準のC言語でないことと同じではありません。言語とライブラリは、Cの個別のエンティティです。独自のヘッダーに独自のマクロを定義した場合よりも、C89に準拠しません。

ただし、コードではなくコマンドラインでマクロを定義することをお勧めします。

-std=c89 -D_USE_MATH_DEFINES

M_PIを定義していないmath.h実装に遭遇した場合、コマンドラインで定義されたマクロを同様に使用することにより、コードを変更せずに簡単に修正できます。

-std=c89 -DM_PI=3.14159265358979323846
8
Clifford