这是一个简单的问题,但为什么会有人使用#define来定义常量?
之间有什么区别
#define sum 1
和const int sum = 1;
答案 0 :(得分:39)
#define
有许多不同的应用程序,但您的问题似乎是关于一个特定的应用程序:定义命名常量。
在C ++中,很少有理由使用#define
来定义命名常量。
#define
通常广泛用于C代码,因为在定义常量时C语言与C ++有很大不同。简而言之,const int
对象在C中不是常量,这意味着在C中定义真常量的主要方法是使用#define
。 (另外,对于int
常量,可以使用枚举。)
答案 1 :(得分:35)
没有人不应该!
实际上,由于多种原因,我们应该优先const int sum = 1;
而不是#define sum 1
:
基于范围的机制:
#define
不尊重范围,因此无法创建类范围的命名空间。虽然const变量可以在类中作用域。
在编译错误期间避免奇怪的魔法数字:
如果您正在使用#define
那些在预编译时被预处理器取代那么如果您在编译期间收到错误,那将会引起混淆,因为错误消息不会引用宏名称而是值和它会出现突然的价值,而且会浪费很多时间在代码中跟踪它。
易于调试:
同样出于与#2中提到的相同的原因,虽然调试#define
实际上没有提供任何帮助。
因此,为避免上述情况,const
将是更好的选择。
答案 2 :(得分:8)
对于你刚给出的例子,我通常会使用const。除了当然,#define可以用于其他地方的条件编译:
#if SOME_DEFINE == 1
// Conditional code
#endif
这是你无法用const做的事情。如果您不需要从预处理器访问该值,我会说使用const,除非有一些原因导致这是不可能的。在C++ FAQ lite中有一些内容,他们正确地指出,仅仅因为预处理器是“邪恶的”,它并不意味着你永远不需要它。
答案 3 :(得分:3)
#define
是必要的,以使包含保护工作,因为C ++没有真正的模块导入系统。
#define
会导致字面文字替换。预处理器理解如何标记源代码,但不知道它实际上意味着什么。当您编写#define sum 1
时,预处理器会检查您的代码并查找令牌sum
的每个实例,并将其替换为令牌1
。
这有各种限制:#define sq(x) x * x
如果您像sq(3+3)
一样使用它将无法正常工作;并且使用#define
作为常量不以任何方式考虑范围,也不将任何类型的类型与常量相关联。但是,可以使用#define
(特别是与#
和##
预处理器运算符等其他特殊内容组合使用)来做一些其他方法无法实现的魔法(除非通过手动执行预处理器确实如此。
答案 4 :(得分:2)
总是尝试使用“const int”,而不是#define。
使用#define,仅当您的预处理器代码可能被其他工具读取时,它更容易与预处理器一起使用,而不是解析语言。
此外,这是定义某些内容的唯一方法,以便稍后通过#if /#else /#endif
进行检查答案 5 :(得分:0)
简单来说就是
#define sum 1 /*is pre processed*/
这意味着,在预处理阶段结束后sum
不存在。
const int sum = 1; /*is compiled/linked*/
这意味着sum
存在,直到可执行文件由您的程序构成。
答案 6 :(得分:0)
const int
只是一个无法改变的int。 #define
是C预处理器的指令,它不仅仅用于定义常量。
答案 7 :(得分:0)
由丹尼尔·梁(Daniel Liang)撰写的Introduction to programming with C++中指出:
使用
#define
指令定义常量时,该常量为 不存储在内存中。常量将被替换为一个值 编译器。当您使用const
关键字声明常量时, 常量就像变量一样存储在内存中。
如果需要在多个程序中使用常量,请使用#define
在头文件中定义它,以便可以将其包含在其他程序中。如果仅在一个程序中使用常量,则使用const
进行声明会更有效。
答案 8 :(得分:-1)
第一个是预处理程序指令,在编译器编译代码之前,它将通过并用1替换sum。第二个在内存中声明一个变量来保存该数量。我敢肯定可以说哪个是最好的,但是“const int”在C ++中可能更常见(当谈到数字常量时)。
http://www.geekpedia.com/KB114_What-is-the-difference-between-sharpdefine-and-const.html