Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C和C+中的宏定义+;_C++_C_Macros - Fatal编程技术网

C++ C和C+中的宏定义+;

C++ C和C+中的宏定义+;,c++,c,macros,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) 这些是位值,例如1、2、4。八, Bit 0 = (1 << 0) = 1 Bi

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

/* Flags for ds_flags */ 
#define DSF_OVER        (1<<0)  
#define DSF_DISPLAY     (1<<1)    
#define DSF_CALLFLOW    (1<<2) 

这些是位值,例如1、2、4。八,

Bit 0 = (1 << 0) = 1
Bit 1 = (1 << 1) = 2
Bit 2 = (1 << 2) = 4
Bit 3 = (1 << 3) = 8
...etc...

Bit 0=(1这确实是为了清晰起见-它表明不同的定义是位掩码,通常一起用于过滤输入值。我不知道您是否已经知道位掩码是什么-这里有一个链接:

当看到类似的内容时

#define DSF_FOO 0x800
#define DSF_BAR 2048
没有多少人能够很快看到只设置了一个位,而且是哪个位

#define DSF_FOO (1<<11)

#define DSF_FOO(1唯一的潜在优势是更容易看出代码使用一个不同的位集正确定义了每个常量


不管您是否喜欢
(1),只要使用
(1)编写1、2、4而不是
1,大多数人都会一目了然。有些时候,位的位置表示一些位操作,例如:

#define DSF_OVER        (1<<0)  is 1
#define DSF_DISPLAY     (1<<1)  is 2  
#define DSF_CALLFLOW    (1<<2)  is 4 (This is not 3)
这里不能有值5,因为它是两位启用的(二进制中的101位)。为了避免此类潜在错误,使用宏使用
>
总是安全的。当下一位二进制中应该是1000位时,它不能通过错误生成值5(101)


所有这些都是关于编程的便利性以产生无错误代码。

很抱歉我的无知。但请您详细解释一下。如果我们将这些定义为--@Lundin:以及可读性和直观性,那么会有什么不同呢?还有健壮性、灵活性和易于维护的问题,这非常重要如果要更改一个字段,例如
(1不,可读性和易于维护不是一回事,尽管表单肯定有助于后者。不,我的意思是
(1@Lundin:请澄清,您是否真的认为看到
0x10000
需要超过16位比看到
1更容易“所有程序员都懂十六进制。"这完全是胡说八道。大多数程序员都不会背诵十六进制。我们生活在2011年,主要问题在于抽象、良好的设计和高级语言功能。只有少数程序员仍然需要摆弄位,更不用说想要摆弄位了。即使是那些摆弄位的程序员,在64位系统时代也是如此像0x200000000这样的数字远没有可读性,也不是“等一下,我超出了32位边界”的时刻。此外,没有人真的想麻烦“我需要设置61位,它的十六进制是什么?”理想情况下,此代码应该使用位移位
模板
而不是手动编码的
大家好…感谢您的解释,现在它开始有意义了。因为(1@user496934:有时是为了节省空间,但通常在一个整数字段中存储多个独立的逻辑值更有用。使用显式
std::set
的优点是可以得到“set literals”和更简洁的语法(训练有素的人仍然可以阅读)。在处理硬件时,有时还需要特定位(例如,在某个I/O端口上,可能需要指定第五位,因为这是硬件的接线方式,
(1问题可能是宏名称。如果是DSF_掩码,您会立即意识到0x800的含义。@Lundin:我怀疑宏名称在识别设置的位方面是否有任何区别。无论名称如何,没有多少人会看到134217728中设置的位。这并不意味着设置的位是掩码。您可以使用它如REG |=DSF_掩码或REG&=~DSF_掩码。如果您认为(1@Lundin:您可以将其用作掩码。但您不必这样做。
(1如果您要在定义后添加随机内容,则可能应该对其进行注释。即使这不是真正的代码。(此外,您还将
DSF\u CALLNEW
设置为文本
double
)不值得a-1,但这根本不是真的。有时选择魔法数字是为了“有趣”十六进制,例如引入Java字节码的0xCAFEBABE。这与位操作无关,但以十进制形式写入源代码是荒谬的。@Steve是的,这就是程序员使用十六进制数字的唯一原因:编写包含字母ABCDEF的书呆子笑话。这与十六进制bein毫无关系g比原始二进制数更容易阅读。你真的认为我是在说这是“唯一的原因”,还是你只是不善于被纠正?不,我是在挖苦:)
// Multiple options are combined with bitwise-or
show_message(DSF_CAPTION|DSF_ALERT, "Hey...");
...

// Checking is made using bitwise-and, not equality
if (status & DSF_RUNNING)
  ...
#define DSF_OVER        (1<<0)  is 1
#define DSF_DISPLAY     (1<<1)  is 2  
#define DSF_CALLFLOW    (1<<2)  is 4 (This is not 3)
#define DSF_OVER       1
#define DSF_DISPLAY    2  
#define DSF_CALLFLOW   4
#define DSF_CALLNEW    5.