为什么使用#define而不是variab

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

Greener asked 2020-01-14T05:43:26Z
8个解决方案
116 votes

g++ -DDEBUG something.cpp是C和C ++预处理语言的一部分。 在代码中使用它们时,编译器仅将2701852318487806806977语句替换为所需的内容。 例如,如果您一直讨厌写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
}

如果您只想在某些特定的构建中使用某些代码,那么它对于条件编译(另一个主要用途是g++ -DDEBUG something.cpp)也非常有用:

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

大多数编译器都允许您从命令行定义宏(例如2701852318487806806),但是您也可以像这样在代码中放置一个定义:

#define DEBUG

一些资源:

  1. 维基百科文章
  2. C ++特定站点
  3. 有关GCC预处理程序的文档
  4. 微软参考
  5. 特定于C的网站(不过,我认为它与C ++版本没有什么不同)
supercheetah answered 2020-01-14T05:44:52Z
41 votes

这些天大多是文体。 当C很小的时候,就没有像const变量这样的东西。 因此,如果您使用变量而不是STOP 999,则无法保证某人不会更改其值,从而在整个程序中造成破坏。

在过去,FORTRAN通过引用甚至将常量传递给子例程,并且有可能(和引起头痛)将“ 2”之类的常量值更改为其他值。 一次,这发生在我正在开发的程序中,并且唯一提示我们有问题的地方是,当程序运行STOP 999时,我们应该得到一个ABEND(异常结束),该程序应该正常结束。

Paul Tomblin answered 2020-01-14T05:43:51Z
23 votes

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

像这样:

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

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

Harpee answered 2020-01-14T05:45:28Z
7 votes

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

Puppy answered 2020-01-14T05:45:48Z
7 votes

C过去没有使用const,因此#defines是提供常量值的唯一方法。 C和C ++现在都拥有它们,因此没有必要使用它们,除非要使用#ifdef / ifndef对其进行测试。

answered 2020-01-14T05:46:08Z
4 votes

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

YXD answered 2020-01-14T05:46:29Z
1 votes

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

以下是一些使用define的示例,这些示例不能用变量代替:

  1. #定义min(i,j)((((i)<(j))?(i):(j))
    请注意,这是由预处理程序评估的,而不是在运行时评估的

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

DanJ answered 2020-01-14T05:47:06Z
0 votes

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

编辑:正如尼尔在对本帖子的评论中所指出的那样,标头中的显式带有值的定义适用于C ++,但不适用于C。

charley answered 2020-01-14T05:47:31Z
translate from https://stackoverflow.com:/questions/6004963/why-use-define-instead-of-a-variable