为什么有人会使用#define定义常量?

这是一个简单的问题,但为什么有人会使用#define来定义常量?

有什么区别

#define sum 1const 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每个实例,并用令牌1replace它。

这有多种限制: #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