Préprocesseurs Objective-C

le Objective-C Preprocessorne fait pas partie du compilateur, mais constitue une étape distincte du processus de compilation. En termes simplistes, un préprocesseur Objective-C n'est qu'un outil de substitution de texte et il demande au compilateur d'effectuer le prétraitement requis avant la compilation réelle. Nous appellerons le préprocesseur Objective-C l'OCPP.

Toutes les commandes du préprocesseur commencent par un symbole dièse (#). Il doit s'agir du premier caractère non vide, et pour la lisibilité, une directive de préprocesseur doit commencer dans la première colonne. La section suivante répertorie toutes les directives importantes du préprocesseur -

Sr.No. Directive et description
1

#define

Remplace une macro de préprocesseur

2

#include

Insère un en-tête particulier à partir d'un autre fichier

3

#undef

Annule la définition d'une macro de préprocesseur

4

#ifdef

Renvoie true si cette macro est définie

5

#ifndef

Renvoie true si cette macro n'est pas définie

6

#if

Teste si une condition de compilation est vraie

sept

#else

L'alternative pour #if

8

#elif

#else an #if dans une instruction

9

#endif

Termine le préprocesseur conditionnel

dix

#error

Imprime un message d'erreur sur stderr

11

#pragma

Envoie des commandes spéciales au compilateur en utilisant une méthode standardisée

Exemples de préprocesseurs

Analysez les exemples suivants pour comprendre diverses directives.

#define MAX_ARRAY_LENGTH 20

Cette directive indique à l'OCPP de remplacer les instances de MAX_ARRAY_LENGTH par 20. Utilisez #define pour les constantes afin d'augmenter la lisibilité.

#import <Foundation/Foundation.h>
#include "myheader.h"

Ces directives indiquent à l'OCPP d'obtenir foundation.h à partir de Foundation Frameworket ajoutez le texte au fichier source actuel. La ligne suivante indique à OCPP d'obtenirmyheader.h à partir du répertoire local et ajoutez le contenu au fichier source actuel.

#undef  FILE_SIZE
#define FILE_SIZE 42

Cela indique à l'OCPP d'annuler la définition de FILE_SIZE existant et de le définir comme 42.

#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif

Cela indique à l'OCPP de définir MESSAGE uniquement si MESSAGE n'est pas déjà défini.

#ifdef DEBUG
   /* Your debugging statements here */
#endif

Cela indique à l'OCPP de faire le traitement des instructions incluses si DEBUG est défini. Ceci est utile si vous passez l' indicateur -DDEBUG au compilateur gcc au moment de la compilation. Cela définira DEBUG, vous pouvez donc activer et désactiver le débogage à la volée pendant la compilation.

Macros prédéfinies

ANSI C définit un certain nombre de macros. Bien que chacun soit disponible pour votre utilisation en programmation, les macros prédéfinies ne doivent pas être directement modifiées.

Sr.No. Macro et description
1

__DATE__

La date actuelle sous forme de littéral de caractères au format "MMM JJ AAAA"

2

__TIME__

L'heure actuelle sous forme de littéral de caractère au format "HH: MM: SS"

3

__FILE__

Il contient le nom de fichier actuel sous forme de chaîne littérale.

4

__LINE__

Celui-ci contient le numéro de ligne actuel sous forme de constante décimale.

5

__STDC__

Défini comme 1 lorsque le compilateur est conforme à la norme ANSI.

Essayons l'exemple suivant -

#import <Foundation/Foundation.h>

int main() {
   NSLog(@"File :%s\n", __FILE__ );
   NSLog(@"Date :%s\n", __DATE__ );
   NSLog(@"Time :%s\n", __TIME__ );
   NSLog(@"Line :%d\n", __LINE__ );
   NSLog(@"ANSI :%d\n", __STDC__ );
   
   return 0;
}

Lorsque le code ci-dessus dans un fichier main.m est compilé et exécuté, il produit le résultat suivant -

2013-09-14 04:46:14.859 demo[20683] File :main.m
2013-09-14 04:46:14.859 demo[20683] Date :Sep 14 2013
2013-09-14 04:46:14.859 demo[20683] Time :04:46:14
2013-09-14 04:46:14.859 demo[20683] Line :8
2013-09-14 04:46:14.859 demo[20683] ANSI :1

Opérateurs de préprocesseur

Le préprocesseur Objective-C propose les opérateurs suivants pour vous aider à créer des macros -

Continuation macro (\)

Une macro doit généralement être contenue sur une seule ligne. L'opérateur de continuation de macro est utilisé pour continuer une macro qui est trop longue pour une seule ligne. Par exemple -

#define  message_for(a, b)  \
   NSLog(@#a " and " #b ": We love you!\n")

Stringize (#)

L'opérateur stringize ou number-sign ('#'), lorsqu'il est utilisé dans une définition de macro, convertit un paramètre de macro en une constante de chaîne. Cet opérateur ne peut être utilisé que dans une macro qui a un argument ou une liste de paramètres spécifié. Par exemple -

#import <Foundation/Foundation.h>

#define  message_for(a, b)  \
   NSLog(@#a " and " #b ": We love you!\n")

int main(void) {
   message_for(Carole, Debra);
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

2013-09-14 05:46:14.859 demo[20683] Carole and Debra: We love you!

Collage de jetons (##)

L'opérateur de collage de jetons (##) dans une définition de macro combine deux arguments. Il permet à deux jetons distincts dans la définition de macro d'être joints en un seul jeton. Par exemple -

#import <Foundation/Foundation.h>

#define tokenpaster(n) NSLog (@"token" #n " = %d", token##n)

int main(void) {
   int token34 = 40;
   
   tokenpaster(34);
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

2013-09-14 05:48:14.859 demo[20683] token34 = 40

Comment cela s'est-il passé, car cet exemple entraîne la sortie réelle suivante du préprocesseur -

NSLog (@"token34 = %d", token34);

Cet exemple montre la concaténation du token ## n en token34 et ici nous avons utilisé les deux stringize et token-pasting.

L'opérateur défini ()

Le préprocesseur definedL'opérateur est utilisé dans les expressions constantes pour déterminer si un identificateur est défini à l'aide de #define. Si l'identificateur spécifié est défini, la valeur est true (non nulle). Si le symbole n'est pas défini, la valeur est false (zéro). L'opérateur défini est spécifié comme suit -

#import <Foundation/Foundation.h>

#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif

int main(void) {
   NSLog(@"Here is the message: %s\n", MESSAGE);  
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

2013-09-14 05:48:19.859 demo[20683] Here is the message: You wish!

Macros paramétrées

L'une des fonctions puissantes de l'OCPP est la possibilité de simuler des fonctions à l'aide de macros paramétrées. Par exemple, nous pourrions avoir du code pour mettre un nombre au carré comme suit -

int square(int x) {
   return x * x;
}

Nous pouvons réécrire le code ci-dessus en utilisant une macro comme suit -

#define square(x) ((x) * (x))

Les macros avec des arguments doivent être définies à l'aide du #definedirective avant de pouvoir les utiliser. La liste d'arguments est placée entre parenthèses et doit suivre immédiatement le nom de la macro. Les espaces ne sont pas autorisés entre le nom de la macro et les parenthèses ouvertes. Par exemple -

#import <Foundation/Foundation.h>

#define MAX(x,y) ((x) > (y) ? (x) : (y))

int main(void) {
   NSLog(@"Max between 20 and 10 is %d\n", MAX(10, 20));  
   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

2013-09-14 05:52:15.859 demo[20683] Max between 20 and 10 is 20