为什么使用 #define 而不是变量

Why use #define instead of a variable

本文关键字:变量 #define 为什么      更新时间:2023-10-16

C++#define有什么意义?我只见过使用它代替"幻数"的例子,但我不认为只是将该值赋予变量有什么意义。

#define是 C 和 C++ 预处理器语言的一部分。 当它们在代码中使用时,编译器只是将 #define 语句替换为您想要的任何内容。 例如,如果您厌倦了一直写for (int i=0; i<=10; i++),则可以执行以下操作:

#define fori10 for (int i=0; i<=10; i++)
// some code...
fori10 {
    // do stuff to i
}

如果你想要更通用的东西,你可以创建预处理器宏:

#define fori(x) for (int i=0; i<=x; i++)
// the x will be replaced by what ever is put into the parenthesis, such as
// 20 here
fori(20) {
    // do more stuff to i
}

如果您只想在某些特定构建中使用某些代码,它对于条件编译(#define的另一个主要用途)也非常有用:

// compile the following if debugging is turned on and defined
#ifdef DEBUG
// some code
#endif

大多数编译器将允许您从命令行定义宏(例如 g++ -DDEBUG something.cpp ),但您也可以在代码中放置一个定义,如下所示:

#define DEBUG

一些资源:

  1. 维基百科文章
  2. C++特定站点
  3. 有关 GCC 预处理器的文档
  4. Microsoft参考
  5. 资料
  6. C 特定站点(我认为它与C++版本没有什么不同)

这些天主要是风格。 当 C 年轻时,没有常量变量这样的东西。 因此,如果您使用变量而不是#define,则无法保证某个地方的某个人不会更改它的值,从而在整个程序中造成严重破坏。

在过去,FORTRAN通过引用将偶数常量传递给子例程,并且有可能(并且引起头痛)将像"2"这样的常量的值更改为不同的东西。 有一次,这发生在我正在处理的一个程序中,我们唯一有问题的提示是,当程序达到应该正常结束它的STOP 999时,我们会得到一个 ABEND(异常结束)。

有一次我在工作中遇到了麻烦。 我被指控在数组声明中使用"幻数"。

喜欢这个:

int Marylyn[256], Ann[1024];

公司的政策是避免这些神奇的数字,因为有人向我解释说,这些数字不是便携式的;它们阻碍了维护的便利性。 我认为,当我阅读代码时,我想知道数组到底有多大。我输掉了争论,所以,在一个星期五的下午,我用 #defines 替换了冒犯性的"幻数",就像这样:

 #define TWO_FIFTY_SIX 256
 #define TEN_TWENTY_FOUR 1024
 int Marylyn[TWO_FIFTY_SIX], Ann[TEN_TWENTY_FOUR];

在接下来的星期一下午,我被叫来,被指控有消极的反抗倾向。

#define可以完成一些正常C++无法完成的工作,例如保护标头和其他任务。但是,它绝对不应该用作幻数 - 应该使用静态常量。

C 没有常量,所以 #defines 是提供常量值的唯一方法。C 和 C++ 现在都有它们,所以使用它们没有意义,除非它们要用 #ifdef/ifndef 进行测试。

最常见的用法(声明常量除外)是包含保护。

定义在

预处理器编译之前进行评估,而变量在运行时引用。这意味着您可以控制应用程序的构建方式(而不是其运行方式)

以下是几个使用 define 的示例,这些示例不能被变量替换:

  1. #define min(i, j) ((i) <(j)) ?(一) : (j))
    注意 这是由预处理器评估的,而不是在运行时评估的

  2. http://msdn.microsoft.com/en-us/library/8fskxacy.aspx

#define允许您

在标头中建立一个值,否则该值将编译为大于零的大小。 标头不应编译为大于零的大小。

// File:  MyFile.h
// This header will compile to size-zero.
#define TAX_RATE 0.625
// NO:  static const double TAX_RATE = 0.625;
// NO:  extern const double TAX_RATE;  // WHAT IS THE VALUE?

编辑:正如Neil在这篇文章的评论中指出的那样,标题中的显式定义与值适用于C++,但不适用于C。