数据结构——栈与队列
2026/6/23 6:16:50
在 Linux / GCC / Clang 中:
#include<cmath>通常就能用:
M_PI但在MSVC中:
M_PI默认不定义所以才会出现:
error C2065: “M_PI”: 未声明的标识符在使用前手动定义:
#ifndefM_PI#defineM_PI3.14159265358979323846#endif能用
不优雅
易重复定义
不类型安全
#include <cmath>之前:#define_USE_MATH_DEFINES#include<cmath>然后就可以:
doublex=M_PI;注意:
<cmath>之前稳定
兼容老代码
非标准 C++
std::numbers::pi#include<numbers>doublex=std::numbers::pi;或指定类型:
doublex=std::numbers::pi_v<double>;floaty=std::numbers::pi_v<float>;标准
类型安全
无宏
跨平台
不污染命名空间
强烈推荐
M_PItemplate<typenameT>Tfoo(){returnT(M_PI);// 不推荐}#include<numbers>template<typenameT>Tpi(){returnstd::numbers::pi_v<T>;}很多数值库内部都会写:
constexprdoublekPi=3.14159265358979323846;或:
staticconstexprdoublepi=std::acos(-1.0);也可以用:
constexprdoublepi=std::acos(-1);标准
无宏
编译期常量
add_definitions(-D_USE_MATH_DEFINES)或:
target_compile_definitions(your_target PRIVATE _USE_MATH_DEFINES)| 场景 | 推荐 |
|---|---|
| 新项目 / 现代 C++ | std::numbers::pi |
| 旧 MSVC 项目 | _USE_MATH_DEFINES |
| 模板 / 数值库 | std::numbers::pi_v<T> |
| 快速修 bug | 手动#define M_PI(临时) |