Cを使用して、定数M_PI(3.14159 ...)にアクセスしようとしています。 math.hヘッダーファイルをインポートしましたが、M_PI定数は未定義のままでした。 StackOverflowを検索したところ、コードに#define _USE_MATH_DEFINES
を追加する必要があることがわかりました(以下のサンプルコードを参照)。これは通常のコンパイルでは問題なく動作しますが、私が実行している作業のためにstd=c89
フラグを使用してコンパイルできる必要があります。
一部のC89コードからM_PIにアクセスするにはどうすればよいですか?
準拠する標準ライブラリファイルmath.h
は必須ではなく、実際には必須ではないデフォルトでM_PI
を定義します。このコンテキストでは、「デフォルト」とは、M_PI
がコンパイラ固有のトリックによってのみ定義されなければならないことを意味します。
定数を自分で定義するだけです(M_PI
という名前を自由に使用できますが、非準拠コンパイラでコードをコンパイルできるようにするには、最初にM_PI
が定義されていないことを確認する必要があります)。慣例のために、M_PI
をpi(の近似)以外のものとして定義しないでください。
私は行きます
#ifndef M_PI
# define M_PI 3.14159265358979323846
#endif
M_PI
はC標準では必須ではありません。これは単なる共通の拡張であるため、標準になりたい場合はそれに依存しないでください。ただし、独自の#define
を簡単に定義することができます。前回確認したとき、それが汎用定数であることを確認したので、混乱する余地はあまりありません。 :)
ここで何が問題なのかわかりません。 -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