当前位置: 首页 > news >正文

#define与其他代码的对比替代(C++)

本人初学c++,写代码作业时看见了一行带define的代码,于是仔细了解了difine各种用法以及功能相同的对比代码。各种信息如下:

#define——C++的预处理器指令,很多用法较为危险(出错),建议慎用(新版的C++有很多更加安全的替代品)

定义常量(宏 vs const)

#define

#include <iostream> #define PI 3.14159 #define MAX_BUFFER_SIZE 1024 int main() { std::cout << "PI = " << PI << '\n'; // 展开为 std::cout << 3.14159 std::cout << "MAX_BUFFER_SIZE = " << MAX_BUFFER_SIZE << '\n'; // 展开为 std::cout << 1024 return 0; }
本质

预处理,在编译之前纯文本替换,宏名被直接替换为定义的文本,编译器看不到宏名。

const
#include <iostream> const double PI = 3.14159; // 普通 const 变量(运行时常量) const int MAX_BUFFER_SIZE = 1024; // 普通 const 变量(编译期常量,因为整型) int main() { std::cout << "PI = " << PI << '\n'; // 打印 3.14159 std::cout << "MAX_BUFFER_SIZE = " << MAX_BUFFER_SIZE << '\n'; // 打印 1024 return 0; }
本质有类型的只读变量,可能分配存储

带参数的函数式宏 (宏 vs 内联函数 / constexpr 函数)

#include <iostream> // 宏定义(有陷阱) #define SQUARE(x) x * x #define MIN(a, b) ((a) < (b) ? (a) : (b)) // 替代:内联函数模板 template<typename T> inline T square_inline(T x) { return x * x; } template<typename T> inline T min_inline(T a, T b) { return a < b ? a : b; } // 替代:constexpr 函数 constexpr int square_constexpr(int x) { return x * x; } int main() { std::cout << "=== 宏版本(容易出错)===\n"; int r1 = SQUARE(2 + 3); // 展开为 2+3*2+3 = 11 std::cout << "SQUARE(2+3) = " << r1 << " (期望 25)\n"; int x = 1, y = 2; int m1 = MIN(++x, y); // 副作用:x 自增两次 std::cout << "MIN(++x, y) 后 x = " << x << " (自增两次)\n"; std::cout << "\n=== 内联函数/constexpr 版本(安全)===\n"; std::cout << "square_inline(2+3) = " << square_inline(2 + 3) << '\n'; std::cout << "square_constexpr(2+3) = " << square_constexpr(2 + 3) << '\n'; x = 1, y = 2; int m2 = min_inline(++x, y); std::cout << "min_inline(++x, y) 后 x = " << x << " (自增一次)\n"; return 0; }

条件编译(宏 #ifdef vs if constexpr)

#include <iostream> #include <string> // 宏方式:通过定义或取消 DEBUG 宏来控制 // 此处我们定义 DEBUG 来演示开启状态 #define DEBUG #ifdef DEBUG #define LOG(msg) std::cout << "[DEBUG] " << msg << '\n' #else #define LOG(msg) ((void)0) #endif // 替代方案:C++17 if constexpr(需要模板) template<bool EnableDebug> void log(const std::string& msg) { if constexpr (EnableDebug) { std::cout << "[DEBUG] " << msg << '\n'; } } int main() { std::cout << "=== 条件编译:宏 ===\n"; LOG("This is a debug message (macro)"); // 如果定义了 DEBUG 则输出 std::cout << "\n=== 条件编译:if constexpr ===\n"; constexpr bool debug_enabled = true; // 可改为 false 测试关闭 log<debug_enabled>("This is a debug message (if constexpr)"); return 0; }

头文件卫士(VS#pragma once)

#ifndef MYHEADER_H #define MYHEADER_H // 头文件内容 #endif //替换为 #pragma once // 头文件内容

总结:宏 vs 现代 C++ 特性

宏用途(部分)推荐替代方案说明
常量const类型安全,作用域可控
函数式宏inline/constexpr函数 / 模板避免副作用,类型检查
条件编译constexpr if/ 模板 / 构建配置尽量缩小预处理范围
头文件卫士#pragma once更简洁,防重名
http://www.jsqmd.com/news/449342/

相关文章:

  • [FMQL30TAI开发]FPAI开发相关重要概念梳理
  • 简单了解一下页表
  • 打开软件就弹出d3dx10_37.dll如何修复? 附免费下载方法分享
  • 用Python制作一个文字冒险游戏
  • C++动态链接库开发
  • 代码性能剖析工具
  • PC在线流程图制作工具 中文操作简单高效出图
  • 基于SpringBoot+Vue的海南自贸港智慧服务平台设计与实现
  • 实时音频处理C++实现
  • Git log 自定义输出
  • 基于贝叶斯优化CNN-LSTM混合神经网络预测附Matlab代码
  • 缓存穿透问题及其解决方案
  • 国标GB28181设备端EasyGBD新版本支持采集接入Windows本机Camera和远端RTSP视频流接入到国标GB28181平台
  • ssm基于java的五台山景点购票系统(源码+文档+调试+jsp)
  • 计算机毕业设计:电商数据智能分析预测系统 Django requests爬虫 ARIMA预测 数据可视化 课程设计 毕业设计 大数据 大模型 agent(建议收藏)✅
  • 小杰云商城 V1.0.5 安全加固版发布:把踩过的坑都填平,让你安心运营的电商系统
  • 计算机毕业设计java基于JAVA语言的在线问诊系统 基于B/S架构的在线医疗咨询与挂号服务平台设计与实现 面向患者的在线问诊、电子病历与药品配送一体化系统开发
  • 中间件选型:AI系统如何选择消息队列与缓存?
  • 卡梅德生物解读减肥新靶点曲戈卢单抗(Trevogrumab,靶向肌肉生长抑制素GDF8)
  • 掌握大数据领域 OLAP 数据建模的核心要点
  • nodejs基于vue的运城学院健身房客户关系管理系统vue
  • 河道水域墙体区域垃圾河道要素识别分割数据集labelme格式147张4类别
  • 基于VSG控制的MMC并网逆变器仿真模型附Simulink仿真
  • 模板代码生成工具
  • 企业如何通过智能体解决重复繁琐的问题,需要用哪些工具
  • 微软开源 Agent Lightning 实战教程(非常详细),Agent 训练从入门到精通,收藏这一篇就够了!
  • LangChain 本地部署与 Agent 智能体助手搭建实战详解 - 指南
  • Ubuntu 内网开放 7005 端口实现 SFTP 数据传输
  • 2026年福建、浙江靠谱且售后响应快的橡胶辊制造厂排行榜 - 工业推荐榜
  • 吃透 JVM 核心知识点:概念、内存、类加载、异常一网打尽