2026/4/18 9:03:19
网站建设
项目流程
订票网站模板,淘宝网站的建设目的,怎么做的360网站打不开,天元建设集团有限公司简介一、问题根源
在 Linux / GCC / Clang 中#xff1a;
#include cmath通常就能用#xff1a;
M_PI但在 MSVC 中#xff1a;
M_PI 默认不定义需要显式开启宏#xff0c;或自己定义或使用 C20 标准方案
所以才会出现#xff1a;
error C2065: “M_PI”: 未声明的标识…一、问题根源在 Linux / GCC / Clang 中#includecmath通常就能用M_PI但在MSVC中M_PI默认不定义需要显式开启宏或自己定义或使用C20 标准方案所以才会出现error C2065: “M_PI”: 未声明的标识符二、最简单粗暴不推荐但常见在使用前手动定义#ifndefM_PI#defineM_PI3.14159265358979323846#endif能用不优雅易重复定义不类型安全三、MSVC 官方方式老项目常用1.在#include cmath之前#define_USE_MATH_DEFINES#includecmath然后就可以doublexM_PI;注意必须在cmath之前只对 MSVC 有意义属于“平台特性”稳定兼容老代码非标准 C四、 推荐方案使用C20std::numbers::pi#includenumbersdoublexstd::numbers::pi;或指定类型doublexstd::numbers::pi_vdouble;floatystd::numbers::pi_vfloat;标准类型安全无宏跨平台不污染命名空间强烈推荐五、如果在模板 / 数值库中非常重要不要在模板中用M_PItemplatetypenameTTfoo(){returnT(M_PI);// 不推荐}推荐#includenumberstemplatetypenameTTpi(){returnstd::numbers::pi_vT;}六、Eigen / GTSAM / 数值库中的惯用写法很多数值库内部都会写constexprdoublekPi3.14159265358979323846;或staticconstexprdoublepistd::acos(-1.0);也可以用constexprdoublepistd::acos(-1);标准无宏编译期常量七、工程级方案如果不能改源码在 CMake 中add_definitions(-D_USE_MATH_DEFINES)或target_compile_definitions(your_target PRIVATE _USE_MATH_DEFINES)八、最终建议场景推荐新项目 / 现代 Cstd::numbers::pi旧 MSVC 项目_USE_MATH_DEFINES模板 / 数值库std::numbers::pi_vT快速修 bug手动#define M_PI临时