为什么在SUCCEEDED宏中有这么多括号?

sha*_*oth 6 c com macros c-preprocessor

Windows SDK具有SUCCEEDED宏:

#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
-----------------------^-------------^-----
Run Code Online (Sandbox Code Playgroud)

与其他宏一样,有一些括号可以确保编译器对意图的正确解释.

我没有得到的是为什么周围有括号(HRESULT)(hr)(我用^字符标记).hr括号化,以便可以存在一些复杂的构造,用HRESULT括号括起来形成C样式的强制转换,然后整个>=构造也用括号括起来,那么为什么额外的括号括起来(HRESULT)(hr)呢?

Pet*_*ham 8

C标准使得演员的优先级高于比较,因此编译器不需要parens.

然而,人们阅读宏定义,并将它们放入使得优先级明确,因此对于阅读它的人来说显而易见的是,它是比较((HRESULT)hr)与零的结果,而不是在没有比较结果的情况下不得不考虑优先权.


Mik*_*our 5

额外的括号不会改变含义,但它们确实使优先级明确.如果没有它们,那些不了解所有优先规则的读者就必须弄清楚表达式的含义.

为了澄清,我只是指在演员表达式周围的括号,如问题中所标记的那样.其他人是必要的(除非宏观只用于C++而不是C,在这种情况下,你可以改变(HRESULT)(hr)HRESULT(hr)).