Préprocesseurs C pour éliminer les blocs conditionnels
Dans le domaine de la programmation C, il est souvent nécessaire d'éliminer le code mort en fonction de paramètres définis. ou des macros non définies. Alors que le préprocesseur C standard offre des capacités de compilation conditionnelle limitées, les exigences avancées exigent des outils spécialisés. Cet article explore un préprocesseur C capable de répondre à un tel besoin.
Considérons le scénario dans lequel une base de code contient des blocs conditionnels tels que :
#ifdef NAME1 #define ALBUQUERQUE "ambidextrous" #else #define PHANTASMAGORIA "ghostly" #endif
Un préprocesseur avec la fonctionnalité souhaitée accepterait des arguments de ligne de commande pour spécifier des macros définies ou non définies, telles que « -DNAME1 » ou « -UNAME1 ». L'exécution de la commande avec '-DNAME1' générerait le résultat suivant :
#define ALBUQUERQUE "ambidextrous"
D'un autre côté, l'exécution de la commande avec '-UNAME1' produirait :
#define PHANTASMAGORIA "ghostly"
Plus complexe les scénarios avec plusieurs conditions et blocs imbriqués peuvent également être traités avec précision. Prenons l'exemple suivant :
#ifdef USE_VOID #ifdef PLATFORM1 #define VOID void #else #undef VOID typedef void VOID; #endif /* PLATFORM1 */ typedef void * VOIDPTR; #else typedef mint VOID; typedef char * VOIDPTR; #endif /* USE_VOID */
L'exécution de la commande avec « -DUSE_VOID -UPLATFORM1 » entraînerait le résultat suivant :
#undef VOID typedef void VOID; typedef void * VOIDPTR;
Enfin, un exemple impliquant des conditions imbriquées :
#ifndef DOUBLEPAD #if (defined NT) || (defined OLDUNIX) #define DOUBLEPAD 8 #else #define DOUBLEPAD 0 #endif /* NT */ #endif /* !DOUBLEPAD */
Passer l'argument '-UOLDUNIX' produire :
#ifndef DOUBLEPAD #if (defined NT) #define DOUBLEPAD 8 #else #define DOUBLEPAD 0 #endif /* NT */ #endif /* !DOUBLEPAD */
Solution recommandée
Sur la base des recommandations fournies dans le fil de discussion d'origine, sunifdef se distingue comme un pré -processeur capable d'éliminer le code mort basé sur des macros définies/non définies. Il a été largement utilisé avec beaucoup de succès, éliminant des milliers de blocs conditionnels inutiles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!