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) #x→STR(42)展开为"42" - 需要拼接 token:
#define CONCAT(a, b) a##b→CONCAT(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;其余所有数据常量,都该交给 const 或 constexpr 管理。
# 处理器
# 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环境变量使用与安全管理
如何在景安服务器上快速搭建个人网站?
如何快速搭建高效简练网站?


