C和C++中的宏定义

use*_*934 0 c c++ macros

我是C/C++的新程序员,已经用Java编程了很长一段时间.我目前正在理解一些C代码.在这里,我看到一些宏定义,如:

/* Flags for ds_flags */ 
#define DSF_OVER        (1<<0)  
#define DSF_DISPLAY     (1<<1)    
#define DSF_CALLFLOW    (1<<2) 
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么我们必须以这种方式定义这些宏.在这些方面获得的优势是什么,而不是在定义如下:

#define DSF_OVER        0
#define DSF_DISPLAY     1    
#define DSF_CALLFLOW    2
Run Code Online (Sandbox Code Playgroud)

Pla*_*aHH 7

看到类似的东西

#define DSF_FOO 0x800
#define DSF_BAR 2048
Run Code Online (Sandbox Code Playgroud)

没有多少人能够快速看到只有一个位被设置,它是什么.

#define DSF_FOO (1<<11)
Run Code Online (Sandbox Code Playgroud)

但是这个很清楚.

  • @Lundin:我怀疑宏名称在识别设置的位上有什么不同.无论名称如何,没有多少人会看到134217728中设置了哪些位. (2认同)
  • @Lundin:你*可以*用它作为面具.但你没必要.`(1 << 11)`只是一个非常方便的语法,看"哦,第11位被设置".这些东西经常被用作位掩码是另一回事,但这并不意味着必须将其用作设置标志的位掩码,它也可以用作其他东西的构建块. (2认同)

Ste*_*sop 5

唯一的潜在优势是,更容易看到代码正确定义了每个常量,并设置了一个不同的位.

大多数人会看到,一目了然无论如何,如果你只写1,2,4代替1<<0,1<<1,1<<2,所以也许很难看到在这个例子的优势.一旦你到达1<<15,有些人会错过像32748这样的拼写错误.