为什么在CPP中有定义的常量和声明的常量?

时间:2010-04-20 21:43:03

标签: c++ const constants

为什么有两种方法可以在CPP中“声明”常量? 哪个更好,或者我应该写,我应该在哪个时候使用?

#define MYCON 100
const int MYCON=100

3 个答案:

答案 0 :(得分:8)

简短规则:对于条件编译(如DEBUG和RELEASE的不同代码片段),使用#define。对于所有其他情况,请使用const构造。

答案 1 :(得分:1)

使用#define生成一个预处理器符号:在预处理发生后它根本不存在,相当于在文件中键入“100”。

预处理程序符号的功能:

  • 您可以在#ifdef
  • 等预处理程序指令中使用它们
  • 它有词汇范围
  • 你可以获取他们的地址(因此不能将它们用作预期type*的参数)

使用const type声明一个c ++变量。

  • 您可以在预处理程序指令中使用此内容
  • 遵循通常的c ++范围规则
  • 你可以拿它的地址

人们普遍认为将const用于“程序”常量更好,而#define仅用于条件编译(这代表了从(非常!)旧时代的变化,当时你不能总是依赖在c编译器上智能地处理const并且首选使用#define。如果没有别的,这可以让你更好地控制符号的范围。

答案 2 :(得分:0)

在C的原始版本中,#define是唯一可用于声明常量值的方法。这是在编译时而不是在运行时完成的:编译器硬编码每条指令的值。 const是C ++的一个特性(后来以有限的方式添加到C中),在C ++中,建议您使用const而不是#define。 const变量实际存在于内存中,并且可以在运行期间在构造时初始化。

但是,

#define仍然经常在C ++中使用,主要用于与编译器进行通信。

一些例子:

用于防止多个类声明的类头包装器:

#ifdef VAL_H
#define VAL_H

// Define class header

#endif // VAL_H

条件编译:

// Comment this line to disable debug output
#define DEBUG

// Some code
#ifdef DEBUG
// Only gets compiled if DEBUG is defined.
cerr << "Debug output here" << endl;
#endif