为什么有人会使用#define定义常量?
这是一个简单的问题,但为什么有人会使用#define来定义常量?
有什么区别
#define sum 1
和const int sum = 1;
#define
有许多不同的应用程序,但你的问题似乎是关于一个特定的应用程序:定义命名常量。
在C ++中,很less有理由使用#define
来定义命名常量。
#define
通常在C代码中被广泛使用,因为在定义常量时,C语言与C ++明显不同。 简而言之, const int
对象不是C中的常量 ,这意味着在C中定义一个真常数的主要方法是使用#define
。 (另外,对于int
常量,可以使用枚举)。
没有人不应该!
其实,一个应该更喜欢const int sum = 1;
超过#define sum 1
的原因有很多:
基于范围的机制:
#define
不尊重作用域,所以没有办法创build一个类作用域名称空间。 虽然constvariables可以在类中作用域。
在编译过程中避免怪异的数字:
如果您正在使用#define
,那么在预编译时被预处理器replace所以如果在编译过程中收到错误,将会引起混淆,因为错误消息不会引用macros名称,而是会显示一个突变值,而且会浪费大量的时间在代码中进行追踪。
debugging简单:
也出于#2中提到的相同的原因,虽然debugging#define
真的没有提供帮助。
因此,为了避免上述情况, const
将是一个更好的select。
对于你刚刚给出的例子,我通常会使用一个const。 当然,#define可以用于其他地方的条件编译:
#if SOME_DEFINE == 1 // Conditional code #endif
这是你不能用const来做的事情。 如果你不需要预处理器可以访问的值,那么我会说使用const,除非有一些原因,这是不可能的。 在C ++ FAQ lite中有一些内容,他们正确地指出,仅仅因为预处理器是“邪恶的”,并不意味着你永远不需要它。
#define
是使包容卫士工作的必要条件,因为C ++没有真正的模块导入系统。
#define
会导致文字上的文字replace。 预处理器理解如何对源代码进行标记,但不知道它的实际含义。 当你编写#define sum 1
,预处理器会遍历你的代码并查找令牌sum
每个实例,并用令牌1
replace它。
这有多种限制: #define sq(x) x * x
将不能正常工作,如果使用它像sq(3+3)
; 而使用#define
作为常量并不以任何方式尊重作用域,也不会将任何types的types与常量关联起来。 但是,可以使用#define
(尤其是与#
和##
预处理器运算符等其他特殊的东西结合使用)来执行一些不可能的魔术(除了手动执行预处理器的操作)。
总是尝试使用“const int”,而不是#define。
只有当预处理器代码可以被另一个工具读取时,才能使用#define,而且它更容易与预处理器一起使用,而不是parsing语言。
此外,它是定义稍后由#if /#else /#endif检查的唯一方法
简而言之,
#define sum 1 is pre processed
也就是说,预处理阶段结束后,这个sum
就不存在了。
const int sum = 1; is compiled/linked
这意味着sum
存在,直到可执行程序从您的程序中。
const int
只是一个不能改变的int。 #define
是C预处理器的一个指令,它不仅仅是定义常量。
有关更多详细信息,请参阅此处: http : //en.wikipedia.org/wiki/C_preprocessor
第一个是预处理器指令,在编译器编译你的代码之前,它会经过并用1代替和。第二个在内存中声明一个variables来保存这个数量。 我确定可以争论哪个是最好的,但是“const int”在C ++中可能更常见(当涉及到数字常量时)。
http://www.geekpedia.com/KB114_What-is-the-difference-between-sharpdefine-and-const.html