2010-01-28 118 views
0

我正在使用一个具有“NT_SUCCESS”成功宏的API。但是他们没有一个失败。所以通常我必须这样做。#定义成功或失败

if(something failed) 
    return !NT_SUCCESS; 
else 
    return NT_SUCCESS; 

有!NT_SUCCESS我不认为是非常可读的。所以,我决定这样做:

#define SUCCESS NT_SUCCESS 
#define FAILURE (!NT_SUCCESS) 

编辑=============================

​​

这是NT_SUCCESS如何声明,做我所做的事情仍然可以。

那会好吗?

非常感谢您的任何建议,

+1

这应该是好 – 2010-01-28 07:52:48

+0

我刚刚编辑我的文章。显示如何声明NT_SUCCESS。谢谢。 – ant2009 2010-01-29 03:01:04

+1

是的,'#define'确定。您可以正确使用它。 – 2010-01-29 03:29:46

回答

4

我想补充括号良好的措施,但除此之外,你应该确定:

#define FAILURE (!(NT_SUCCESS)) 

这是“以防万一”,以防止不良的定义,例如#define NT_SUCCESS 1+1。当然,没有一个理智的实现可以做到这一点,所以你的定义应该也可以。但是,不能因为偏执而伤害。:-)

2

这将是确定

+2

虽然这可能会回答这个问题,但最好解释一下你的陈述背后的更多理由,以帮助他人理解 – Mathlight 2016-06-30 06:48:56

1

你肯定的NT_SUCCESS逻辑否定的值是失败的指示?

+0

是的,那就表示失败。 – ant2009 2010-01-28 07:58:13

5

我建议把失败定义括号:

#define FAILURE (!NT_SUCCESS) 
+0

添加圆括号会有什么不同?谢谢 – ant2009 2010-01-28 07:59:46

+1

它在算术上更安全,并确保它将始终按照您指定的顺序进行评估。 – LiraNuna 2010-01-28 08:12:40

+4

#define SIX 1 + 5 .... #define NINE 8 + 1 ... assert(SIX * NINE == 42); – Yuliy 2010-01-28 08:22:50

0

如果你想成为真正的偏执狂,你应该加上括号:

#define FAILURE (!NT_SUCCESS) 
+0

添加圆括号会有什么不同?谢谢。 – ant2009 2010-01-28 07:59:14

+0

通常,建议在定义宏时使用圆括号,以避免由于简单的文本替换与运算符优先级相结合而导致的意外结果。 – 2010-01-28 08:05:27

+0

@robUK:您应该花一些时间阅读comp.lang.c常见问题解答。特别是:http://c-faq.com/cpp/safemacros.html – jamesdlin 2010-01-28 09:09:15

1

嗯,这实际上依赖。作为一个API,返回相同的错误值有点不寻常,您可以拨打调用。我可以看到的唯一情况是需要的是:

  • 你实际上是从API中发起的回调中返回一个值。
  • 您正在替换API中的代码,因此必须遵循相同的规则。

这可能是NT_SUCCESS为0,但失败可以由任何其他整数指示。这意味着!NT_SUCCESS是而不是这意味着失败的唯一值。

当然,您可以自由地从您的 API返回您希望的任何值,我不一定会使它们与您使用的API中的值相同。你可以很容易地返回故障指示(真=失败,错误=成功),这将使你的代码更漂亮寻找:

return something_failed; 

或者,在最坏的情况,

if (something_failed) return TRUE; 
: : : 
return FALSE; 
1

这是不好的,至少不知道NT_SUCCESS是如何定义的。 它可以被定义为#define NT_SUCCESS 1#define NT_SUCCESS TRUE

在第二种情况下是有意义的写!NT_SUCCESS,所以你的代码是好的,但在第一种情况下,写!NT_SUCCESS意味着!1,这没有任何意义。在第二种情况下,您最好用:

#define SUCCESS NT_SUCCESS 
#define FAILURE -1 //or other value which makes sense 

这取决于您。

+0

!1非常有意义。如果x不为0,则x被定义为0,如果x为0,则x被定义为0. – Yuliy 2010-01-28 08:24:04

+0

#define ENT_NOERR 0/*无错误*/ – ant2009 2010-01-28 10:12:14

+0

#define NT_SUCCESS ENT_NOERR/* ENT_NOERR的同义词/ – ant2009 2010-01-28 10:12:41

2

这不可能是正确的。当然,你应该返回一些错误代码,让调用者有机会找出为什么它不起作用?

相关问题