2010-05-02 10 views
0

Quelqu'un peut-il expliquer le code suivant s'il vous plaît?Explication des macros C++

#if 1 

// loop type 
#define FOR_IS_FASTER 1 
#define WHILE_IS_FASTER 0 
// indexing type 
#define PREINCREMENT_IS_FASTER 1 
#define POSTINCREMENT_IS_FASTER 0 

#else 

// loop type 
#define FOR_IS_FASTER 1 
#define WHILE_IS_FASTER 0 
// indexing type 
#define PREINCREMENT_IS_FASTER 0 
#define POSTINCREMENT_IS_FASTER 1 

#endif 


#if PREINCREMENT_IS_FASTER 
#define ZXP(z) (*++(z)) 
#define ZX(z) (*(z)) 
#define PZ(z) (++(z)) 
#define ZP(z) (z) 
#define ZOFF (1) 
#elif POSTINCREMENT_IS_FASTER 
#define ZXP(z) (*(z)++) 
#define ZX(z) (*(z)) 
#define PZ(z) (z) 
#define ZP(z) ((z)++) 
#define ZOFF (0) 
#endif 

Je peux comprendre ce que les fonctions font, mais par exemple comment le pré-processeur choisir qui sera ZXP exécuter si nous l'appelons plus tard? Que représentent le 1 et le 0?

+0

Tout est probablement fait pour l'obfuscation de code. Vous n'êtes pas censé comprendre tout cela :) – UncleBens

Répondre

6

Le #if 1 déclenche le premier groupe de #define s, qui a mis PREINCREMENT_IS_FASTER à 1. En raison de cela, #if PREINCREMENT_IS_FASTER déclenche la première #define ZXP....

Il n'y a rien d'exceptionnel à propos de 1 et 0 dans ce contexte. La directive #if de préprocesseur réussit si son argument est différent de zéro.

Vous pouvez passer à la forme alternative en changeant la #if 1 en haut du fichier avec #if 0. (Je vous remercie @rabidmachine pour le conseil.)

+0

merci! alors quel est le besoin d'avoir les deux si nous savons toujours que nous allons exécuter le premier ZXP? – rabidmachine9

+1

@rabidmachine: Vous pouvez changer pour utiliser l'autre ensemble en changeant la première ligne à '#if 0' – UncleBens

1

Je suis probablement enclin à être d'accord avec UncleBens et je suggère que c'est fait pour que vous ne le compreniez pas, parce que tout est totalement inutile.