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

时间:2011-05-14 21:41:33

标签: c++ c-preprocessor

C ++中#define的重点是什么?我只看到了用它代替“幻数”的例子,但我没有看到只是将该值赋给变量的重点。

8 个答案:

答案 0 :(得分:111)

#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++ specific site
  3. Documentation on GCC's preprocessor
  4. Microsoft reference
  5. C specific site(我认为它与C ++版本不同)

答案 1 :(得分:42)

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

在过去,FORTRAN通过引用将偶数常量传递给子例程,并且可能(并且令人头疼)将类似'2'的常量值更改为不同的值。有一次,这发生在我正在进行的一个程序中,唯一的提示是我们遇到错误的是当程序遇到应该结束它的STOP 999时,我们会得到一个ABEND(异常结束)通常

答案 2 :(得分:21)

我上班时遇到了麻烦。我被指控在数组声明中使用“魔术数字”。

像这样:

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];

在接下来的星期一下午,我被召入并被指控有被动的挑衅倾向。

答案 3 :(得分:7)

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

答案 4 :(得分:7)

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

答案 5 :(得分:4)

最常见的用法(声明常量除外)是include guard

答案 6 :(得分:1)

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

以下是一些使用define的示例,它们不能被变量替换:

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

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

答案 7 :(得分:0)

#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.