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

时间:2011-06-08 03:50:47

标签: c++ const c-preprocessor

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

之间有什么区别

#define sum 1const int sum = 1;

9 个答案:

答案 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预处理器的指令,它不仅仅用于定义常量。

请点击此处了解详情:http://en.wikipedia.org/wiki/C_preprocessor

答案 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