201 votes

Objective-C : BOOL vs bool

J'ai vu le "nouveau type" BOOL ( YES , NO ).

J'ai lu que ce type de produit est presque comme une char.

Pour les tests, j'ai fait :

NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));

Il est bon de voir que les deux journaux affichent "1" (parfois en C++ bool est un int et sa sizeof est 4).

Je me demandais donc s'il y avait des problèmes avec le type bool ou quelque chose comme ça ?

Puis-je utiliser bool (qui semble fonctionner) sans perdre de vitesse ?

209voto

Barry Wark Points 73462

D'après la définition de objc.h :

#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH
typedef bool BOOL;
#else
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif

#define YES ((BOOL)1)
#define NO  ((BOOL)0)

Donc, oui, vous pouvez supposer que BOOL est un char. Vous pouvez utiliser la fonction (C99) bool mais tous les frameworks Objective-C d'Apple et la plupart du code Objective-C/Cocoa utilisent BOOL, vous vous épargnerez donc des maux de tête si le typedef change un jour en utilisant simplement BOOL.

19 votes

"Tous les cadres d'Apple" - ce n'est pas vrai. Jetez un coup d'œil à CGGeometry.h, en particulier : CG_INLINE bool __CGPointEqualToPoint(CGPoint point1, CGPoint point2) { return point1.x == point2.x && point1.y == point2.y ; }

59 votes

@Elliot Vous avez raison. De nombreux frameworks C (CoreFoundation, CoreGraphics, etc.) utilisent C99. bool . Tous les frameworks Objective-C utilisent BOOL .

0 votes

@Cœur vous avez modifié la définition de l'exemple de code BOOL, mais le texte ci-dessous reste le même. C'est un peu confus et incorrect. Voir ma réponse.

37voto

Meltemi Points 11116

Les gars du Big Nerd Ranch (qui ont littéralement écrit le livre sur la programmation Cocoa/iOS) ont un bon article sur le sujet : Les angles aigus du BOOL .

36voto

beryllium Points 18138

Comme indiqué ci-dessus, BOOL est un caractère signé. bool - type de la norme C99 (int).

BOOL - OUI/NON. bool - vrai/faux.

Voir les exemples :

bool b1 = 2;
if (b1) printf("REAL b1 \n");
if (b1 != true) printf("NOT REAL b1 \n");

BOOL b2 = 2;
if (b2) printf("REAL b2 \n");
if (b2 != YES) printf("NOT REAL b2 \n");

Le résultat est le suivant

REAL b1
REAL b2
PAS VRAI b2

Notez que bool != BOOL. Le résultat ci-dessous est seulement ONCE AGAIN - REAL b2

b2 = b1;
if (b2) printf("ONCE AGAIN - REAL b2 \n");
if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n");

Si vous souhaitez convertir un bool en BOOL, vous devez utiliser le code suivant

BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false;

Donc, dans notre cas :

BOOL b22 = b1 ? 2 : NO;
if (b22)    printf("ONCE AGAIN MORE - REAL b22 \n");
if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n");

Et donc qu'est-ce qu'on a maintenant ? :-)

3 votes

Au lieu d'utiliser l'opérateur ternaire, vous pourriez utiliser !!b1 . Pour passer de l'un à l'autre

1 votes

'NOT REAL b2' ne s'imprime pas sur mon simulateur iPhone SE.

8voto

Georg Schölly Points 63123

Le type Objective-C à utiliser est BOOL . Il n'y a rien de tel qu'un type de données booléen natif, c'est pourquoi, pour être sûr que le code se compile sur tous les compilateurs, il faut utiliser BOOL . (Il est défini dans le fichier Apple-Frameworks.

2 votes

Ce n'est pas tout à fait exact. BOOL est défini par le langage Objective-C (il se trouve dans l'une des pages de l'application objc/*.h ), et non par les cadres. De plus, lorsque l'on compile avec C99 (ce qui est, je pense, la valeur par défaut), il existe un type booléen natif, _Bool (ou bool si stdbool.h est inclus).

5voto

Jeff Points 11642

Oui, BOOL est un typedef pour un signed char selon objc.h.

Je ne sais pas ce qu'il en est de bool. C'est un truc de C++, non ? Si c'est défini comme un caractère signé où 1 est OUI/vrai et 0 est NON/faux, alors j'imagine que cela n'a pas d'importance pour celui que vous utilisez.

Étant donné que BOOL fait partie de l'Objective-C, il est probablement plus logique d'utiliser un BOOL pour plus de clarté (d'autres développeurs Objective-C pourraient être perplexes s'ils voyaient un bool utilisé).

6 votes

_Bool est défini en C99, et dans l'en-tête standard stdbool.h, la macro bool est définie (qui se développe en _Bool) et true/false y sont également définis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X