【问题标题】:Cast pointer that isn't nil to BOOL returns NO将不为零的指针转换为 BOOL 返回 NO
【发布时间】:2011-05-06 11:49:51
【问题描述】:

我最近遇到了一个很少重现的错误。如果我出于某种原因将一个不是 nil 的指针投射到 BOOL,我会得到 NO!!!11 我知道 BOOL 是有符号字符的 typedef。会不会有问题?

【问题讨论】:

  • 为了后代,您是否介意包括一个如何转换为 BOOL 的示例?使用(BOOL)var?
  • 是的。我希望这会给出错误的结果。但我也希望 BOOL b = var; 能够工作;如果没有,我将有很多代码要修复。 :)

标签: objective-c c cocoa


【解决方案1】:

如果指针的形式为 0xNNNNNN00 或(在 64 位上)0xNNNNNNNNNNNNNN00,其中 N 是任何十六进制数字,则转换为 BOOLunsigned char)将为您提供0 因为它会截断所有非零位。

要将指针正确转换为BOOL,请使用不等式运算符:

BOOL isNotNull = (myPointer != NULL);

【讨论】:

  • 你能告诉我“if (obj)”将obj转换成什么类型​​吗?
  • 您可以通过不等式运算符将其转换为BOOL;实际上,它可能会也可能不会这样做,具体取决于系统的指令集。 if (aPointer) 应该始终正常工作。 :)
【解决方案2】:

这是因为指针是 32 位大,而字符只有 8 位。因此,当从指针转换为字符时,它将修剪 24 位。所以剩下的 8 位只是零的可能性非常高,尤其是当指针地址为高时。

你可以做的是:

BOOL myBool = (myPointer != NULL); // This will evaluate if the pointer is true (>0) or false (NULL)

【讨论】:

  • @Jonathan:对不起,不会再发生了。承诺:P
【解决方案3】:

BOOL 不是应该使用的类型,正是出于这个原因。事实上,我认为布尔型变量几乎没有什么用处(而不是仅使用它所基于的原始值、指针或其他任何东西),除非在需要特殊代码来处理的巨型位数组的情况下位。如果你真的想要一个布尔类型,请使用 C99 _Bool(或 stdbool.h 中的 bool),它具有正确的转换语义而不是模 256 减少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2014-10-22
    • 2016-10-23
    • 2014-07-01
    相关资源
    最近更新 更多