C++ 怎么定义常量 C++ #define与const使用场景对比【代码】

发布时间 - 2026-01-30 00:00:00    点击率:
C++中优先使用const或constexpr,仅在条件编译、头文件卫士、字符串化或token拼接等预处理不可替代场景才用#define。

直接说结论:C++ 中优先用 const(或 constexpr),#define 仅在宏替换不可替代的场景下使用,比如条件编译、头文件卫士、或字符串化/拼接。

什么时候必须用 #define

预处理器不关心类型、作用域和语法,只做文本替换。所以以下情况绕不开 #define

  • #ifdef / #ifndef 条件编译——const 变量无法参与预处理判断
  • 头文件卫士:#ifndef MY_HEADER_H#define

    MY_HEADER_H
  • 需要把标识符转成字符串:#define STR(x) #xSTR(42) 展开为 "42"
  • 需要拼接 token:#define CONCAT(a, b) a##bCONCAT(foo, _bar)foo_bar

const#define 安全得多

#define PI 3.14159 看似简单,但它是全局文本替换,没有类型、无作用域、不进调试符号表,且容易因括号缺失出错(如 #define SQUARE(x) x*x 遇到 SQUARE(a + b) 就崩成 a + b*a + b)。

const 则是真正的变量(或引用),受编译器类型检查和作用域控制:

const double PI = 3.14159;        // 类型明确,作用域可控  
const int MAX_SIZE = 1024;        // 编译期常量(C++17 起可作数组维度)  
constexpr int fib(int n) { ... }  // C++11 起支持编译期计算
  • const 变量有地址,能取地址、传引用、用于模板非类型参数(C++17+)
  • constexpr 还能保证编译期求值,比 const 更强(如 constexpr int arr[N]N 必须是 constexpr
  • 调试时能看到 PI 的值;#define 在调试器里根本搜不到

字符串字面量和数组长度的典型陷阱

定义字符串常量时,#define MSG "hello"const char* MSG = "hello"; 行为不同:

  • #define 是纯文本替换,多次使用可能生成多份副本(虽然现代编译器常优化)
  • const char* 是指针,指向同一字符串字面量;若要确保内容不可改且避免指针语义,该用 const char MSG[] = "hello"; —— 这会分配数组,且长度可推导:sizeof(MSG) 包含末尾 \0
  • 定义数组大小时:const int N = 10; 在 C++11 前不能用于 int arr[N];(VLA 不合法),必须用 constexpr int N = 10;#define N 10

真正复杂的地方不在语法,而在「是否需要预处理介入」——一旦涉及 #if、头文件包含控制、或 token 操作,就只能上 #define;其余所有数据常量,都该交给 constconstexpr 管理。


# 处理器  # c++  # 作用域  # 字符串常量  # 常量  # define  # if  # Token  # 标识符  # const  # 字符串  # 预处理器  # char  # int  # 指针  # 头文件  # 还能  # 什么时候  # 则是  # 而在  # 它是  # 得多  # 不开  # 更强  # 可作 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Python3.6正式版新特性预览  如何快速生成专业多端适配建站电话?  深圳网站制作平台,深圳市做网站好的公司有哪些?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Laravel怎么调用外部API_Laravel Http Client客户端使用  Java垃圾回收器的方法和原理总结  香港服务器租用每月最低只需15元?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何快速生成凡客建站的专业级图册?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  如何在阿里云服务器自主搭建网站?  如何在服务器上配置二级域名建站?  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  大连 网站制作,大连天途有线官网?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  如何实现建站之星域名转发设置?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel如何使用Eloquent进行子查询  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何获取PHP WAP自助建站系统源码?  香港服务器如何优化才能显著提升网站加载速度?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  如何在Windows服务器上快速搭建网站?  智能起名网站制作软件有哪些,制作logo的软件?  如何在橙子建站中快速调整背景颜色?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  长沙企业网站制作哪家好,长沙水业集团官方网站?  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  实例解析angularjs的filter过滤器  网站制作企业,网站的banner和导航栏是指什么?  如何在万网自助建站平台快速创建网站?  如何快速生成橙子建站落地页链接?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Java解压缩zip - 解压缩多个文件或文件夹实例  制作电商网页,电商供应链怎么做?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  如何安全更换建站之星模板并保留数据?  JavaScript如何实现倒计时_时间函数如何精确控制  如何在IIS7上新建站点并设置安全权限?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  Laravel如何生成URL和重定向?(路由助手函数)  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  如何在景安服务器上快速搭建个人网站?  如何快速搭建高效简练网站?