这是一个简单的问题,但为什么有人会使用#define
来定义常量呢?
#define sum 1
和const int sum = 1;
之间有什么区别呢?
这是一个简单的问题,但为什么有人会使用#define
来定义常量呢?
#define sum 1
和const int sum = 1;
之间有什么区别呢?
#define
有很多不同的应用,但你的问题似乎是关于一种特定的应用:定义命名常量。
C++中很少使用#define
来定义命名常量。
#define
通常在C代码中广泛使用,因为C语言在定义常量方面与C++有显著的区别。简而言之,在C中,const int
对象不是常量,这意味着在C中定义真正的常量的主要方法是使用#define
。(此外,对于int
常量,可以使用枚举)。
const int
前面不需要加上static
。在C++中,const
对象默认具有内部链接。 - AnT stands with Russia谁都不应该不这么做!
实际上,对于许多原因,人们应该更喜欢const int sum = 1;
而不是#define sum 1
:
基于作用域的机制:
#define
不尊重作用域,因此无法创建类作用域名称空间。而 const 变量可以在类中进行作用域限定。
避免编译错误期间出现奇怪的魔术数字:
如果您使用#define
,则这些宏将在预编译时被替换。因此,如果您在编译过程中收到错误消息,则会感到困惑,因为错误消息不会引用宏名称,而是会出现一个突然的值。您需要在代码中花费大量时间来跟踪它。
易于调试:
同样是由于第2点提到的原因,当调试时使用#define
并不能真正提供帮助。
因此,为避免上述情况,使用 const
将是更好的选择。
#
开头,则会使所有内容都以大粗体显示。 - iammilind#define X
可以使用 #undef X
进行虚拟作用域。 - iammilind对于您刚提到的例子,我通常会使用const。当然,#define可以在其他地方用于条件编译:
#if SOME_DEFINE == 1
// Conditional code
#endif
使用const无法做到这一点。如果不需要将值从预处理器中访问,我建议使用const,除非有某些原因不能这样做。在C++ FAQ lite中有一些相关内容,他们指出预处理器虽然“邪恶”,但这并不意味着你永远不需要它。
#define
是必要的,以使像包含守卫之类的东西起作用,因为C++没有一个真正的模块导入系统。
#define
会导致对文本进行字面替换。预处理器知道如何将源代码标记化,但并不知道其中任何内容的实际含义。当您编写#define sum 1
时,预处理器会遍历您的代码,并查找每个sum
标记的实例,并将其替换为1
标记。
这具有各种限制:#define sq(x) x * x
如果像sq(3+3)
这样使用,将无法正确工作;而使用#define
作为常量不以任何方式尊重范围,也不会将任何类型与常量相关联。然而,#define
可以(尤其是与其他一些特殊的东西结合使用,如#
和##
预处理器运算符)做一些魔法,否则不可能完成(除了手动执行预处理器所做的工作)。
#pragma once
而不是包含保护。 - Kirill V. Lyadvinsky#pragma once
是特定于编译器的。标准没有定义预处理指令的含义。 - Karl Knechtel尽量使用"const int",而不是#define。
只有在您的预处理器代码可能被另一个工具读取,并且它更容易使用预处理器而不是解析语言时,请使用#define。
此外,这也是通过#if/#else/#endif定义稍后要检查的内容的唯一方式。
#define sum 1 /*is pre processed*/
sum
不存在。const int sum = 1; /*is compiled/linked*/
sum
就会存在。#define
会太长了。这就是为什么我简单地说#define
是预处理的原因。 :) - iammilind来自Daniel Liang所写的使用C++进行编程入门中提到:
当您使用
#define
指令定义常量时,该常量不会存储在内存中。该常量将被编译器替换为一个值。当您使用const
关键字声明常量时,该常量像变量一样存储在内存中。
如果常量需要在多个程序中使用,请使用#define
在头文件中定义它,以便可以在其他程序中包含它。如果常量仅在一个程序中使用,则使用const
声明更有效。
第一个是预处理器指令,在编译器编译代码之前,它将遍历并将sum替换为1。第二个在内存中声明一个变量来保存该数量。我相信可以争论哪种方法更好,但“const int”在C++中可能更常见(当涉及到数字常量时)。
http://www.geekpedia.com/KB114_What-is-the-difference-between-sharpdefine-and-const.html
const int
不会在内存中声明一个变量;链接的文章是不正确的。 - Don Rebaconst int sum = 1; const int* sum_ptr = ∑
? - R. Martinho Fernandesconst int
在 作用域 中声明一个变量。这是与使用 #define
创建常量的主要区别。是否为变量分配内存取决于编译器。 - Don Rebaconst
变量的反对意见已经在iammilind's answer中展示,主要是编译/链接性能方面的考虑。
通过#define
定义整数常量是我观察到的老一代C开发人员和实际上是老派C开发人员或受此类人指导以非侵入方式处理旧代码库的C++开发人员中普遍存在的行为。
有趣的是,使用enum
来达到相同目的的情况通常是未知的。每当我有机会时,我将相关的#defines转换为枚举。对于不属于任何组的命名常量,我使用无名称的枚举。
enum { sum = 1 };
这样,我们就可以在C和C++中使用编译时常量。
const int
只是一个不能改变的 int。 #define
是一个指令,用于 C 预处理器,该预处理器不仅仅用于定义常量。