Literal @YES не работает в iOS 5/Xcode 4.4

Новый Xcode 4.4 отсутствует, и он должен поддерживать литералы, такие как

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

и он также должен поддерживать @YES и @NO, который не работает при настройке последней версии iOS 5 (и предшествующей). После компиляции вы увидите сообщение об ошибке:

Неожиданное имя типа "BOOL": ожидаемое выражение

Я знаю, что вы можете исправить это, набрав @(YES) и @(NO). Но я хочу знать, почему он работает не так, как ожидалось.

Ответ 1

Причина в том, что Apple забыла круглые скобки:

#define YES             (BOOL)1

Это будет исправлено в iOS 6 SDK:

#define YES             ((BOOL)1)

Тем временем вы должны ввести @(YES).

Ответ 2

Это полезно для информации о литералах.

В комментариях к этот ответ также указывается:

Есть одна небольшая вещь, о которой я хотел бы предупредить. Литературные блаты также не поддерживаются из-за этого. Тем не менее, быстрое исправление, которое я реализовал, заключалось в добавлении это к началу одного из моих общих заголовков (в проекте iOS)

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

@Ответ phix23s кажется более точным. Вы должны принять это.

Это было полезно добавить из комментариев:

Следует отметить, что это необходимо сделать после #import. Если вы помещаете эти #defines в свой Prefix.pch, они должны обязательно импортировать Foundation раньше в pch