`constexpr` 和 `#define` 之间的区别

Ant*_*REL 16 c++ macros constexpr

所以我读了关于constexpr 和 const 之间有什么区别的有趣答案,但我很好奇 #define 和 constexpr 之间有什么区别?我觉得 constexpr 只是一个可以选择类型的#define。

小智 13

你说得很对。

#define(也称为“宏”)只是在实际编译器之前的预处理器阶段发生的文本替换。而且显然不是打字的。

constexpr另一方面,发生在实际解析期间。而且确实是打字的。不用说,只要有可能,使用constexpr都会更安全一些。


D-R*_*RAJ 9

使用定义的语句#define称为宏。宏有多种用途。

  1. 我们可以使用它们来有条件地编译代码段。
#ifdef ONE
int AddOne(int x) { return x + 1; }

#else
int AddTwo(int x) { return x + 2; }

#endif
Run Code Online (Sandbox Code Playgroud)
  1. 当我们不需要在变量中存储常量时。
#define MAX_BOUND 1000
#define MIN_BOUND 10
Run Code Online (Sandbox Code Playgroud)
  1. 对于我们可以使用宏来更改数据类型的地方。
#ifdef USE_WIDE_CHAR
#define TEXT(...)    L##__VA_ARGS__

#else
#define TEXT(...)    __VA_ARGS__

#endif
Run Code Online (Sandbox Code Playgroud)
  1. 根据条件定义关键字。
#ifdef BUILD_DLL
#define DLL_API __declspec(dllexport)

#else
#define DLL_API __declspec(dllimport)

#endif
Run Code Online (Sandbox Code Playgroud)

由于它们在实际编译阶段之前就已解决,因此我们可以根据某些因素(平台、构建系统、架构等)对源代码进行一些小的改进。

constexpr本质上表明变量或函数可以在编译时解析,但不能保证。

我觉得 constexpr 只是一个可以选择类型的#define。

这并不完全正确。正如我之前所说,因为它们在编译阶段之前就已解决,所以我们可以利用它的一些优势。唯一常见的用途是常量值,编译器可以轻松地将其替换为优化。除此之外,用例也不同。