0

0

c++中define和const哪个好_c++宏定义与常量对比【分析】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-26 09:04:02

|

240人浏览过

|

来源于php中文网

原创

宏定义无类型、仅文本替换,const有类型检查并进入符号表;constexpr是编译期常量首选,宏仅适用于条件编译等特殊场景。

c++中define和const哪个好_c++宏定义与常量对比【分析】

宏定义 #define 没有类型,const 有类型检查

这是最根本的区别#define PI 3.14159 只是文本替换,编译器在预处理阶段就把它替换成字面量,后续完全不感知“PI”是个什么类型;而 const double PI = 3.14159; 会进入符号表,类型是 double,参与类型推导、重载决议、模板实参匹配等。

常见错误现象:

  • #define MAX(a,b) ((a)>(b)?(a):(b)) 时,MAX(i++, j++) 会导致 ij 自增两次 —— 因为宏展开后变成 ((i++)>(j++)?(i++):(j++))
  • const 变量不会出现这类副作用,且支持取地址(&PI 合法),#define 宏不能取地址

const 可以在类内声明并初始化,#define 不能替代类内常量成员

比如想定义一个类的整型常量用于数组维度或模板参数:

class A {
    static const int N = 10;  // ✅ 合法(C++11 起允许内联初始化)
    int arr[N];               // ✅ 编译期可知
};

#define N 10 是全局的,污染命名空间,且无法限定作用域。若用 static const int N; 不初始化,则必须在类外定义(const int A::N;),但 C++11 后基本不需要这么写。

立即学习C++免费学习笔记(深入)”;

注意:只有 integral type(如 intenum)的 static const 才能在类内初始化并用于常量表达式;double 或自定义类型不行(除非是 constexpr)。

GemDesign
GemDesign

AI高保真原型设计工具

下载

需要编译期常量时,优先用 constexpr,不是 #define 也不是普通 const

比如模板非类型参数、case 标签、数组大小等场景,要求必须是编译期常量:

  • const int x = 42; 在 C++11 前不一定被当作编译期常量(取决于是否被取地址或外部链接)
  • constexpr int y = 42; 明确承诺可求值于编译期,且类型安全、可调试、可取地址
  • #define Y 42 虽然也能用,但绕过所有类型和作用域检查,调试器看不到 Y,IDE 无法跳转,重构工具无法识别

所以现代 C++ 中,该用编译期常量的地方,constexpr 是事实标准;宏只保留在极少数场景:条件编译(#ifdef)、拼接 token(##)、字符串化(#)、跨翻译单元的配置开关(如 DEBUG)。

宏定义影响调试和 IDE 支持,const/constexpr 更友好

调试器通常无法显示宏定义的值(GDB/LLDB 看不到 #define 符号),断点打在宏调用处可能跳转错行;而 constconstexpr 变量在调试信息中完整保留名称、类型、值。

IDE(如 CLion、VS2022)对宏的支持有限:无法重命名、无法查找引用、无法显示类型提示。但对 constexpr int MAX_SIZE = 1024; 就能做全链路语义分析。

容易被忽略的一点:#define 的作用域是“从定义点到文件末尾或 #undef”,没有命名空间隔离;而 constconstexpr 遵守 C++ 作用域规则,可以放在 namespace、函数内、甚至 if constexpr 分支里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1496

2023.10.24

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

108

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

337

2023.10.11

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

772

2023.08.22

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6114

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

816

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1064

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1309

2024.03.01

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.1万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号