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

Gre*_*ner 52 c++ c-preprocessor

什么是点#define在C++?我只看到了用它代替"幻数"的例子,但我没有看到只是将该值赋予变量的重点.

sup*_*tah 119

#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
}
Run Code Online (Sandbox Code Playgroud)

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

#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
}
Run Code Online (Sandbox Code Playgroud)

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

// compile the following if debugging is turned on and defined
#ifdef DEBUG
// some code
#endif
Run Code Online (Sandbox Code Playgroud)

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

#define DEBUG
Run Code Online (Sandbox Code Playgroud)

一些资源:

  1. 维基百科文章
  2. C++特定站点
  3. 关于GCC预处理器的文档
  4. 微软参考
  5. C特定网站(我不认为它与C++版本不同)

  • 顺便说一下,现在没有充分的理由在C++中使用`#define`作为常量.事实上,它被认为是非C++或类似的东西. (7认同)
  • 就像一张纸条,这些都是非常人为的例子,只是为了展示预处理器可以做什么.我不建议任何人实际使用这些中的任何一个. (4认同)
  • 注意(int i = 0; i &lt;= x; i ++)的#define fori(x)应该写为(int i = 0; i &lt;=(x); i ++)的#define fori(x)代替。(请注意附加的括号。)在此示例中,括号的使用可能并不明显,但是如果有人在参数x中进行按位运算,则会发生错误。 (3认同)
  • 那些不害怕 BOURNEGOL 的人注定要重蹈覆辙。 (2认同)

Pau*_*lin 41

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

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

  • @farhangdon"这些日子风格迥异." 是这个问题的答案.基本上,如果你的风格允许使用它.[supercheetah](http://stackoverflow.com/a/6005009/641833)答案更好. (9认同)
  • 不是很清楚答案!你在哪里解释为什么我们应该使用#define? (4认同)
  • 现在主要是风格化?没有。更好地使用定义来避免消耗内存的常量,在对可用资源有限的微控制器进行编程时尤其重要。 (2认同)

小智 23

我有一次在工作中遇到麻烦.我被指控在数组声明中使用"魔术数字".

像这样:

int Marylyn[256], Ann[1024];
Run Code Online (Sandbox Code Playgroud)

公司的政策是避免这些神奇的数字,因为有人向我解释说,这些数字不是便携式的; 它们阻碍了易于维护.我认为当我阅读代码时,我想确切地知道数组有多大.我失去了争论,因此,在星期五下午,我用#defines取代了令人讨厌的"魔术数字",如下所示:

 #define TWO_FIFTY_SIX 256
 #define TEN_TWENTY_FOUR 1024

 int Marylyn[TWO_FIFTY_SIX], Ann[TEN_TWENTY_FOUR];
Run Code Online (Sandbox Code Playgroud)

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

  • 他们是严格的:) (31认同)
  • 他们非常正确.`#define MARYLYN_SIZE 256`就是你想要的. (11认同)
  • 关键在于分离意义.*为什么*是256 VS 1024重要?这是一个"神奇数字",因为没有迹象表明价值为何如此重要.当您知道值为何重要时,字面值就变得不那么重要了. (3认同)
  • 然后你被解雇了,对吗?这不是一种非常专业的行为方式.你不在线,没有执行分配给你的简单任务.公司的政策是正确的 - 只是倾倒在'256`和'1024`是不可维护的,但面对这个_你决定让它变得更糟糕_.如果这种行为继续在我的位置,你会******. (3认同)

Pup*_*ppy 7

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


小智 6

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

  • @Erbureth consts在编译时是已知的. (2认同)
  • @Erbureth:我认为命名空间范围内的const值默认具有内部链接,因此您也没有使用全局变量.但这可能只适用于积分常数. (2认同)
  • 如果我在页面下面进一步阅读评论,我已经看到这一点已经完成了.那好吧. (2认同)