Clarence Asked:2020-11-12 01:43:05 +0000 UTC2020-11-12 01:43:05 +0000 UTC 2020-11-12 01:43:05 +0000 UTC 定义和常量之间的区别[重复] 772 C++ 中的#define 和 const 有什么区别?也就是说,哪个选项更可取,在什么情况下,有什么区别吗? c++ 5 个回答 Voted Harry 2020-11-12T01:49:44Z2020-11-12T01:49:44Z 当然有。至少因为它const启用了类型检查。编译器知道什么是const,并且知道它是否在正确的位置。#define只有预处理器知道. 所以-总是更可取const的。 Best Answer Ariox 2020-11-12T02:01:58Z2020-11-12T02:01:58Z #define是一个预处理器宏,它只是用它的内容替换一行文本。在 c++11 之前,将其用于全局数字常量是有意义的。 const是一个类型限定符,表示变量在初始化后不应更改。但是这种初始化必须发生在某个地方,并且可以使用const_cast. 在 c++11 中,添加了限定符constexpr,这表明变量只能在编译时以某种方式修改,而不是在运行时。细节取决于标准的版本。现在您可以轻松声明静态常量,包括复杂类型。例如: namespace constants{ static constexpr double g = 9.8; struct minus_fn_impl{ template<class T> T operator () (const T& lha, const T& rha){ return lha - rha; } }; static constexpr minus_fn_impl minus_fn; } ... double v = 5.3; double r = constants::minus_fn(v, constants::g); // не нужно инициализировать функциональный объект, как в случае std::minus Suvitruf - Andrei Apanasik 2020-11-12T01:49:09Z2020-11-12T01:49:09Z #define是一个预处理器指令;预处理器在编译时替换所有这些宏。 const变量是语言的实际变量。例如,类型检查等中的常量加号。 一般来说,据我所知,我们最终会得到同样的结果。除非,定义没有范围,而常量有。 Profi_GMan 2020-11-12T01:51:42Z2020-11-12T01:51:42Z 区别在于:编译器只是在编译时替换定义,即 您编写这样的代码: #define NAME "Alex" ... std::cout << NAME 当您开始编译时,编译器首先将其转换为: std::cout << "Alex" 然后才编译。但是当你使用 const 时,会创建一个普通变量,只是它不能被改变,即 如果你试图改变它,编译器会报错 Alex Titov 2020-11-12T02:48:41Z2020-11-12T02:48:41Z 仅在无法使用 const(c++11 中的 constexpr)的情况下使用 #define。即不建议长时间使用#define 来定义常量。
当然有。至少因为它
const启用了类型检查。编译器知道什么是const,并且知道它是否在正确的位置。#define只有预处理器知道.所以-总是更可取
const的。#define是一个预处理器宏,它只是用它的内容替换一行文本。在 c++11 之前,将其用于全局数字常量是有意义的。const是一个类型限定符,表示变量在初始化后不应更改。但是这种初始化必须发生在某个地方,并且可以使用const_cast.在 c++11 中,添加了限定符
constexpr,这表明变量只能在编译时以某种方式修改,而不是在运行时。细节取决于标准的版本。现在您可以轻松声明静态常量,包括复杂类型。例如:#define是一个预处理器指令;预处理器在编译时替换所有这些宏。const变量是语言的实际变量。例如,类型检查等中的常量加号。一般来说,据我所知,我们最终会得到同样的结果。除非,定义没有范围,而常量有。
区别在于:编译器只是在编译时替换定义,即 您编写这样的代码:
#define NAME "Alex" ... std::cout << NAME当您开始编译时,编译器首先将其转换为:std::cout << "Alex"然后才编译。但是当你使用 const 时,会创建一个普通变量,只是它不能被改变,即 如果你试图改变它,编译器会报错仅在无法使用 const(c++11 中的 constexpr)的情况下使用 #define。即不建议长时间使用#define 来定义常量。