c++ - `constexpr` 和 `#define` 之间的区别
问题描述
因此,我阅读了有关 constexpr 和 const 之间有什么区别的有趣答案,但我很好奇 #define 和 constexpr 之间的区别是什么?我觉得 constexpr 只是一个可以选择类型的#define。
解决方案
使用定义的语句#define
称为宏。宏被用于多种用途。
- 我们可以使用它们有条件地编译代码段。
#ifdef ONE
int AddOne(int x) { return x + 1; }
#else
int AddTwo(int x) { return x + 2; }
#endif
- 当我们不需要将常量存储在变量中时。
#define MAX_BOUND 1000
#define MIN_BOUND 10
- 对于我们可以使用宏来更改数据类型的地方。
#ifdef USE_WIDE_CHAR
#define TEXT(...) L##__VA_ARGS__
#else
#define TEXT(...) __VA_ARGS__
#endif
- 根据条件定义关键字。
#ifdef BUILD_DLL
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
由于它们是在实际编译阶段之前解决的,我们可以根据某些因素(平台、构建系统、架构等)对源代码进行小幅改进。
constexpr
本质上表明可以在编译时解析变量或函数,但不能保证。
我觉得 constexpr 只是一个可以选择类型的#define。
它并不完全正确。正如我之前所说,因为它们是在编译阶段之前解决的,所以我们可以利用它。唯一常见的用途是编译器可以轻松替换为优化的常量值。除此之外,用例是不同的。
推荐阅读
- excel - 有什么建议可以加快此代码或使其更高效(VBA Excel)?
- java - Spring Data/SQL Query 按集合查找所有匹配项
- python-3.x - 如何在 Python 中运行代码之前添加延迟
- xml - 如何进行休息调用并将 xml 响应存储在 XSLT 中的变量中?
- python - 基于区域合并区域
- linux - 如何在dockerfile的后台运行命令?
- flutter - RevenueCat 商店尝试购买产品时出现问题
- html - Tailwind 中的复杂表
- spring-boot - 外部 Apache Tomcat 服务器中的 springdoc-openapi
- laravel - 如何在 laravel 中使用 orWhere() 和 where