2011-05-06 59 views
1

我最近遇到了一個很少重現的bug。如果我因爲某種原因拋出一個不爲BOOL的指針,我得到NO!11我知道BOOL是signeddef的signed char。這可能是一個問題嗎?不是BOOL的投影指針返回NO

+0

對於後代,你會介意包括如何投射到BOOL的例子嗎?使用'(BOOL)var'? – 2011-05-09 20:09:35

+0

是的,就是這樣。 – 2011-05-11 16:33:33

+0

是的。我希望能給出錯誤的結果。但我也希望只是'BOOL b = var;'能夠工作;如果沒有,我會有很多代碼來修復。 :) – 2011-05-16 21:31:53

回答

4

如果指針的形式0xNNNNNN00或(64位)0xNNNNNNNNNNNNNN00,其中N是任何十六進制數字,然後強制轉換爲BOOL(一unsigned char)會留下0,因爲它會截斷所有的非零位。

的指針正確地轉換爲BOOL,使用不等於運算符:

BOOL isNotNull = (myPointer != NULL);

+0

你能告訴我「if(obj)」將obj轉換爲什麼類型? – 2011-05-06 12:06:05

+1

您可以像通過不等式運算符轉換爲「BOOL」在實踐中,根據系統的指令集可能會或可能不會這樣做。 '如果(aPointer)'應該總是正常工作。 :) – 2011-05-06 12:14:16

4

它是因爲一個指針是32位大而char只是8位。所以當從一個指針轉換爲char時,它將修剪24位。所以其餘8位只是零的可能性非常高,特別是當指針地址很高時。

你可以做的是:

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

哦,只需幾秒鐘。 – 2011-05-06 11:56:59

+0

@Jonathan:對不起,它不會再發生。承諾:P – JustSid 2011-05-06 12:00:28

1

BOOL不應該使用,因爲這確切原因類型。事實上,我可以想象使用一個布爾類型變量(而不是僅僅使用原始值,指針或其他類型的變量),除非在巨型位數組中需要特殊代碼來解決位。如果您確實需要布爾類型,請使用C99 _Bool(或中的bool),它具有正確的轉換語義而不是模256縮減。