2015-01-30 22 views
5

In Objective-C abbiamo parole chiave diverse per valutare valori booleani. Abbiamo YES/NO, TRUE/FALSE e (c99) true/false. Capisco BOOL vs bool abbastanza bene e questo articolo vengono illustrate le differenze meravigliosamente:Objective-C TRUE/FALSE vs true/false

http://www.bignerdranch.com/blog/bools-sharp-corners/

Allora, cosa YES/NO significa che non è la mia domanda. La mia domanda è, qual è la differenza tra TRUE/FALSE e true/false? La versione maiuscola è un alias per YES/NO o un alias per (c99) true/false? Oppure, è un altro animale del tutto (come YES/NO)?

risposta

15

Gli identificatori YES e NO sono considerati i valori letterali Objective-C standard per BOOL. Solitamente non troverete YES, NO o BOOL al di fuori del codice sorgente di Objective-C. Si noti che questi identificatori sono in realtà macro definiti in objc/objc.h.

I true e false identificatori sono standard C99 (come avrete notato), se si #include <stdbool.h>. Nota che, dal momento che stai usando Objective-C, probabilmente stai includendo stdbool.h indirettamente, anche se non lo conosci. Ad esempio, Foundation.h include CoreFoundation.h, che include stdbool.h. Pertanto è piuttosto difficile compilare una moderna app iOS o Mac senza ottenere true e false.

Gli identificatori TRUE e FALSE non sono standard. Sono bagagli storici definiti da varie biblioteche. Le librerie potrebbero essere state scritte prima dell'avvento di C99, o scritte dopo ma destinate a supportare i compilatori pre-C99, o semplicemente scritte da autori ignoranti dei letterali booleani C99. Su Mac, alcuni esempi di tali librerie sono Kerberos, XDR/RPC e ncurses. Ancora più importante, le intestazioni del kernel Mach definiscono le costanti TRUE e FALSE e (come con lo stdbool.h) è piuttosto difficile evitare queste definizioni particolari se si sta costruendo una moderna app iOS o Mac.

In tutti i casi che ho trovato, TRUE è definito come 1 o (1) e FALSE è definito come 0 o (0).

(tutte le librerie che ho citato, e il kernel Mach, risalgono a C99 e sono quindi giustificati nel definire le proprie costanti booleane.)

+1

Di tutti i miei articoli su Google con Google e simili con argomenti simili, questa è di gran lunga la risposta più concisa e precisa che si possa chiedere. –

1

Per quanto riguarda ncurses, il/FALSE/utilizzo TRUE bool precede C99 e è documentato in XPG4 Curses del 1996. Gli script di configurazione di ncurses controllano e utilizzano i valori esistenti di C++ e c99 quando sono disponibili. Si veda ad esempio il registro delle modifiche ncurses a partire da early 1997

Problemi correlati