news 2025/12/27 21:58:56

C++ error C2065: “M_PI”: 未声明的标识符 解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ error C2065: “M_PI”: 未声明的标识符 解决方案

一、问题根源

在 Linux / GCC / Clang 中:

#include<cmath>

通常就能用:

M_PI

但在MSVC中:

  • M_PI默认不定义
  • 需要显式开启宏,或自己定义
  • 或使用C++20 标准方案

所以才会出现:

error C2065: “M_PI”: 未声明的标识符

二、最简单粗暴(不推荐,但常见)

在使用前手动定义:

#ifndefM_PI#defineM_PI3.14159265358979323846#endif

能用
不优雅
易重复定义
不类型安全


三、MSVC 官方方式(老项目常用)

1.在#include <cmath>之前

#define_USE_MATH_DEFINES#include<cmath>

然后就可以:

doublex=M_PI;

注意:

  • 必须在<cmath>之前
  • 只对 MSVC 有意义
  • 属于“平台特性”

稳定
兼容老代码
非标准 C++


四、 推荐方案

使用C++20std::numbers::pi

#include<numbers>doublex=std::numbers::pi;

或指定类型:

doublex=std::numbers::pi_v<double>;floaty=std::numbers::pi_v<float>;

标准
类型安全
无宏
跨平台
不污染命名空间

强烈推荐


五、如果在模板 / 数值库中(非常重要)

不要在模板中用M_PI

template<typenameT>Tfoo(){returnT(M_PI);// 不推荐}

推荐:

#include<numbers>template<typenameT>Tpi(){returnstd::numbers::pi_v<T>;}

六、Eigen / GTSAM / 数值库中的惯用写法

很多数值库内部都会写:

constexprdoublekPi=3.14159265358979323846;

或:

staticconstexprdoublepi=std::acos(-1.0);

也可以用:

constexprdoublepi=std::acos(-1);

标准
无宏
编译期常量


七、工程级方案(如果不能改源码)

在 CMake 中:

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(临时)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/24 4:01:04

一块8088单板机,桌面上的技术玩具

我的书桌左上角&#xff0c;常年搁着一块巴掌大的墨绿色电路板。在双屏显示器、机械键盘和无线充电座的包围中&#xff0c;它显得如此突兀——四十年前的8088单板机&#xff0c;像一位误入数字盛宴的旧时代绅士&#xff0c;沉默地躺在3D打印的亚克力底座上。 一、时光的琥珀这…

作者头像 李华
网站建设 2025/12/23 22:33:23

数字签名与数字证书

在介绍数字签名和数字证书前&#xff0c;先简单了解两个算法&#xff1a;Hash算法和RSA算法。 Hash算法&#xff1a;Hash算法是将可变长度的数据块M作为输入&#xff0c;产生固定长度的Hash值&#xff08;或者叫做摘要&#xff09;。可以将Hash算法看作一个非常复杂的CRC算法&…

作者头像 李华
网站建设 2025/12/25 22:45:42

国密算法全家桶:一文认清 SM 系列 “安全卫士”

一、除了加密还能干嘛 加密技术主要分为三大类&#xff1a;对称加密、非对称加密 和 哈希算法。 加密不仅仅是加密数据那么简单&#xff0c;已经被玩出花来了 在当前数字化时代&#xff0c;无论是支付缴费、身份认证还是业务数据处理&#xff0c;都需要密码技术构筑安全屏障…

作者头像 李华
网站建设 2025/12/24 10:59:36

RocketMQ的事务消息是如何实现的?

RocketMQ 通过 TransactionListener 接口实现事务消息机制&#xff0c;其工作流程如下&#xff1a;发送半消息首先向 Broker 发送一条半消息&#xff08;状态标记为"prepared"&#xff09;&#xff0c;该消息会被存储在事务日志中但暂不可消费。执行本地事务半消息发…

作者头像 李华
网站建设 2025/12/24 8:09:13

招标平台最难的战斗:在持续变化中保持数据稳定与精准

招标平台的“动态数据治理”&#xff1a;如何应对政策变化、源站改版与信息规范的持续挑战&#xff1f; 一个稳定的招标信息服务平台&#xff0c;其后台并非一成不变。相反&#xff0c;它运行在一个充满动态变化的环境中&#xff1a;采购政策频繁调整、各级官方招标公告网改版…

作者头像 李华