Visual C++でM_PI(円周率)を使う

Visual C++で円周率の定義M_PIなどを使う場合、gccなどと同じ風に使おうとするとM_PIが見つからないと怒られてしまいます。毎回Visual C++の場合どうやって書くんだっけなーとググって解決しているので、対応方法をまとめておこうかと思います。環境はVisual Studio 2017になります。

現象

Visual C++でM_PIを使いたい場合、gccなどと同じようにcmathをincludeしただけでは下記のようなエラーが出てコンパイルが通りません。

error C2065: 'M_PI': 定義されていない識別子です。

対策

基本的にはcmathをincludeする前に、_USE_MATH_DEFINESをdefineしてやればコンパイルが通るようになります。

#define _USE_MATH_DEFINES  
#include <cmath>

参考:

数値演算定数

注意点としては、他のヘッダファイルのincludeよりも前に_USE_MATH_DEFINESの定義を書きましょう。そうでないと、他のヘッダファイルが間接的にcmathをinluceしていた場合、エラーが解決しないので・・・。

この辺の詳しい原因はこちらのブログで詳しく解説してあり、非常に参考になりました。

定数M_PIが使えない - 需要のないページ
能書き かなり間があいたので、小ネタ。 毎度ながら、知ってる人にとっては当たり前の内容を有難そうに書く。 遭遇したエラー 例えば、次のようなコードを書いたとする。 まあ、半径から円の面積を計算するだけの、よく見るコードだ。 ただし、円周率を自前で定義しているあたり、このコードはモダンでない。 _USE_MATH_DEF...

C++を独自に拡張するのは別にいいのですが、まずは標準のC++の仕様を満たした上で拡張してほしいものですね。頼むぞMicrosoft。

コメント