Literal @YES not working in iOS 5 / Xcode 4.4

3.2k Views Asked by At

New Xcode 4.4 is out and it should support literals like

@42
@"String"
@23.0L
@{ @"key" : obj } and
@[obj1, obj2]

and it should also support @YES and @NO, which isn't working when targeting latest iOS 5 (and prior). After compiling it show the error message:

Unexpected type name 'BOOL': expected expression

I know you can fix it by typing @(YES) and @(NO). But I want to know the reason why it isn't working as expected.

2

There are 2 best solutions below

1
On BEST ANSWER

The reason is Apple forgot the parentheses here:

#define YES             (BOOL)1

This will be fixed in iOS 6 SDK:

#define YES             ((BOOL)1)

In the meantime you must type @(YES).

5
On

This is useful for information about literals.

A commenter on this answer also points out:

There is one small thing I'd like to warn about. Literal bools are also not supported because of this. However, a quick fix that I implemented was adding this to the beginning of one of my common headers (in an iOS project)

#ifndef __IPHONE_6_0 
#if __has_feature(objc_bool) 
#undef YES 
#undef NO 
#define YES __objc_yes 
#define NO __objc_no 
#endif 
#endif

@phix23s answer seems to be more to the point. You should accept that.

This was worth adding from comments:

It should be noted that this needs to be done after the #import . If one puts these #defines in their Prefix.pch, they should make sure to import Foundation earlier in the pch