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

50 c++ const c-preprocessor

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

有什么区别

#define sum 1const int sum = 1;

AnT*_*AnT 40

#define 有许多不同的应用程序,但您的问题似乎是关于一个特定的应用程序:定义命名常量.

在C++中,很少有理由使用它#define来定义命名常量.

#define通常在C代码中广泛使用,因为在定义常量时C语言与C++有很大不同.简而言之,const int对象不是C中的常量,这意味着在C中定义真常量的主要方法是使用#define.(另外,对于int常量,可以使用枚举).

  • 枚举怎么样? (5认同)
  • @ user788552更多指向答案并不意味着它总是如此 (2认同)

Alo*_*ave 39

没有人不应该!
其实,每个人都应该喜欢const int sum = 1;#define sum 1了几个原因:

基于范围的机制:

#defines不尊重范围,因此无法创建类范围的命名空间.虽然const变量可以在类中作用域.


在编译错误期间避免奇怪的魔法数字:

如果您正在使用#define它们在预编译时被预处理器替换那么如果您在编译期间收到错误,那将会引起混淆,因为错误消息不会引用宏名称而是值,它将显示为突然值,并且一个人会浪费很多时间在代码中跟踪它.


易于调试:

同样出于#2中提到的相同原因,虽然调试#define实际上没有提供任何帮助.


因此,避免上述情况const将是更好的选择.

  • 大声笑,"为什么有人会使用#define?" "由于多种原因:1)它很糟糕2)它很糟糕3)它很糟糕" (3认同)

Sve*_*ven 8

对于你刚给出的例子,我通常会使用const.除了当然,#define可以用于其他地方的条件编译:

#if SOME_DEFINE == 1
    // Conditional code
#endif
Run Code Online (Sandbox Code Playgroud)

这是const无法做到的事情.如果您不需要从预处理器访问该值,我会说使用const,除非有一些原因导致这是不可能的.在C++ FAQ lite中有一些内容,他们正确地指出,仅仅因为预处理器是"邪恶的",它并不意味着你永远不需要它.