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

在 C + + 中 #define的意义是什么?我只看到过用它来代替“魔术数字”的例子,但是我不认为仅仅给一个变量赋值有什么意义。

129481 次浏览

最常用的(除了声明常量)是 包括警卫

#define允许您在头中建立一个值,否则这个值将被编译为 size-more-than-zero。标头不应编译为大于零的大小。

// 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 来说就不行了。

最近风格比较流行。在 C 年轻的时候,没有常量这种东西。因此,如果使用变量而不是 #define,就无法保证某个地方的某个人不会更改它的值,从而在整个程序中造成混乱。

在过去,FORTRAN 甚至通过引用将常量传递给子例程,并且有可能(令人头疼的是)将类似“2”的常量的值改变为不同的值。有一次,这种情况发生在我正在编写的一个程序中,我们得到的唯一提示是,当程序遇到应该正常结束程序的 STOP 999时,我们会得到一个 ABEND (异常结束)。

#define可以完成一些普通 C + + 无法完成的任务,比如保护头文件和其他任务。但是,它绝对不应该被用作一个神奇的数字-应该使用静态常量来代替。

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

#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. Wikipedia article
  2. C + + 特定站点
  3. Documentation on GCC's preprocessor
  4. 微软参考资料
  5. C 特定站点 (我不认为它与 C + + 版本有什么不同)

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

Here are a couple examples that use define which cannot be replaced by a variable:

  1. 定义 min (i,j)((i) < (j) ? (i) : (j))
    注意,这是由预处理器计算的,而不是在运行时

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

I got in trouble at work one time. I was accused of using "magic numbers" in array declarations.

像这样:

int Marylyn[256], Ann[1024];

公司的政策是避免使用这些神奇的数字,因为有人向我解释说,这些数字是不可移植的; 它们妨碍了易于维护。我认为,当我阅读代码时,我想确切地知道数组有多大。我输掉了这场争论,因此,在一个周五的下午,我把令人讨厌的“神奇数字”换成了 # Definition,就像这样:

 #define TWO_FIFTY_SIX 256
#define TEN_TWENTY_FOUR 1024


int Marylyn[TWO_FIFTY_SIX], Ann[TEN_TWENTY_FOUR];

在接下来的一个星期一下午,我被叫到这里,被指责有消极反抗的倾向。