Préprocesseur C
Le préprocesseur C ne fait pas partie du compilateur, mais constitue une étape distincte dans le processus de compilation. En un mot, les préprocesseurs C ne sont rien de plus que des outils de remplacement de texte qui demandent au compilateur d'effectuer le prétraitement requis avant la compilation proprement dite. Nous abrégerons C Preprocessor en CPP.
Toutes les commandes du préprocesseur commencent par un signe dièse (#). Il doit s'agir du premier caractère non nul et, pour améliorer la lisibilité, les directives du préprocesseur doivent commencer à partir de la première colonne. Toutes les directives importantes du préprocesseur sont répertoriées ci-dessous :
指令 | 描述 |
---|---|
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个 #if……#else 条件编译块 |
#error | 当遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
Exemples de préprocesseur
Analysez les exemples suivants pour comprendre les différentes instructions.
#define MAX_ARRAY_LENGTH 20
Cette directive indique à CPP de remplacer tous les MAX_ARRAY_LENGTH par 20. Utilisez #define pour définir des constantes afin d'améliorer la lisibilité.
#include <stdio.h>#include "myheader.h"
Ces instructions indiquent à CPP d'obtenir stdio.h à partir de la bibliothèque système et d'ajouter le texte au fichier source actuel. La ligne suivante indique à CPP d'obtenir myheader.h du répertoire local et d'ajouter le contenu au fichier source actuel.
#undef FILE_SIZE#define FILE_SIZE 42
Cette directive indique à CPP d'annuler la FILE_SIZE définie et de la définir sur 42.
#ifndef MESSAGE #define MESSAGE "You wish!"#endif
Cette directive indique à CPP de définir MESSAGE uniquement si MESSAGE n'est pas défini.
#ifdef DEBUG /* Your debugging statements here */#endif
Cette directive indique à CPP d'exécuter l'instruction de traitement si DEBUG est défini. Cette directive est utile si vous transmettez le commutateur -DDEBUG au compilateur gcc au moment de la compilation. Il définit DEBUG et vous pouvez activer ou désactiver le débogage à tout moment pendant la compilation.
Macro prédéfinies
ANSI C définit de nombreuses macros. Vous pouvez utiliser ces macros en programmation, mais vous ne modifiez pas directement ces macros prédéfinies.
宏 | 描述 |
---|---|
__DATE__ | 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。 |
__TIME__ | 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。 |
__FILE__ | 这会包含当前文件名,一个字符串常量。 |
__LINE__ | 这会包含当前行号,一个十进制常量。 |
__STDC__ | 当编译器以 ANSI 标准编译时,则定义为 1。 |
Essayons l'exemple suivant :
#include <stdio.h>main(){ printf("File :%s\n", __FILE__ ); printf("Date :%s\n", __DATE__ ); printf("Time :%s\n", __TIME__ ); printf("Line :%d\n", __LINE__ ); printf("ANSI :%d\n", __STDC__ );}
Lorsque le code ci-dessus (dans le fichier test.c) est compilé et exécuté, il produit les résultats suivants :
File :test.cDate :Jun 2 2012Time :03:36:24Line :8ANSI :1
Opérateurs de préprocesseur
Le préprocesseur C fournit les opérateurs suivants pour vous aider à créer des macros :
Opérateur de continuation de macro ()
Une macro est généralement écrite sur une seule ligne. Mais si la macro est trop longue pour tenir sur une seule ligne, utilisez l'opérateur de continuation de macro (). Par exemple :
#define message_for(a, b) \ printf(#a " and " #b ": We love you!\n")
Opérateur de constante de chaîne (#)
Dans la définition de la macro, lorsque vous devez convertir les paramètres d'une macro en constante de chaîne, utilisez le symbole d'opération de constante de chaîne (# ). Cet opérateur utilisé dans une macro possède un argument ou une liste d'arguments spécifique. Par exemple :
#include <stdio.h>#define message_for(a, b) \ printf(#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 produira les résultats suivants :
Carole and Debra: We love you!
Marquez l'opérateur de collage (##)
à l'intérieur de la macro définition L'opérateur de collage de jeton (##) combine deux arguments. Il permet de fusionner deux balises indépendantes en une seule balise dans une définition de macro. Par exemple :
#include <stdio.h>#define tokenpaster(n) printf ("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 :
token34 = 40
Cela se produit parce que cette instance produit la sortie réelle suivante du compilateur :
printf ("token34 = %d", token34);
Cet exemple montre que token##n sera connecté à token34 Ici, nous utilisons l'opérateur constant de chaîne (#) et pour marquer l'opération de collage Symbole (##). . Opérateur
défini()
préprocesseur L'opérateur défini est utilisé dans les expressions constantes pour déterminer si un identifiant a été défini à l'aide de #define Pass. La valeur est vraie (différente de zéro) si l'identifiant spécifié est défini. Si l'identifiant spécifié n'est pas défini, la valeur est fausse (zéro). L'exemple suivant montre l'utilisation de l'opérateur défini() :
#include <stdio.h>#if !defined (MESSAGE) #define MESSAGE "You wish!"#endifint main(void){ printf("Here is the message: %s\n", MESSAGE); return 0;}
Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :
Here is the message: You wish!
Macro paramétrée
Une fonctionnalité puissante de CPP est la possibilité d’utiliser des macros paramétrées pour simuler des fonctions. Par exemple, le code suivant calcule le carré d'un nombre :
int square(int x) { return x * x;}
On peut réécrire le code ci-dessus à l'aide de macros, comme suit :
#define square(x) ((x) * (x))
Avant d'utiliser une macro avec des paramètres, vous devez utiliser #define définition de la directive. La liste des paramètres est placée entre parenthèses et doit suivre immédiatement le nom de la macro. Aucun espace n'est autorisé entre le nom de la macro et la parenthèse ouvrante. Par exemple :
#include <stdio.h>#define MAX(x,y) ((x) > (y) ? (x) : (y))int main(void){ printf("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 les résultats suivants :
Max between 20 and 10 is 20