26

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

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

4

4 に答える 4

41

準拠する標準ライブラリ ファイルmath.hは必須ではないだけでなく、実際にはデフォルトで定義してはなりません。M_PIこのコンテキストでは、「デフォルトで」とは、M_PIコンパイラ固有のトリックによってのみ定義されなければならないことを意味し、ほとんどの場合、予約された識別子の使用による未定義の動作です。

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

于 2011-02-15T19:12:29.103 に答える
28

私は行きます

#ifndef M_PI
#    define M_PI 3.14159265358979323846
#endif
于 2011-02-15T18:37:44.560 に答える
9

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

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

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

-std=c89 -D_USE_MATH_DEFINES

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

-std=c89 -DM_PI=3.14159265358979323846
于 2011-02-15T20:56:20.930 に答える
9

M_PIC標準では必要ありません。これは単なる一般的な拡張であるため、標準にしたい場合はそれに依存しないでください。ただし、独自の定数を簡単に定義できます。#define前回確認したときは、それが普遍的な定数であったため、混乱する余地はあまりありません。:)

于 2011-02-15T18:37:30.083 に答える