2008-08-19 5 views
15

Je m'interroge sur les cas où il est envoyé pour utiliser les instructions #define et #if. Je le savais depuis un moment, mais je ne l'ai jamais intégré dans ma façon de coder. Comment cela affecte-t-il exactement la compilation?Comment utilisez-vous #define?

Est-ce que #define est la seule chose qui détermine si le code est inclus lors de la compilation? Si j'ai #define DEBUGme comme un symbole personnalisé, le seul moyen de l'exclure de la compilation est de supprimer cette déclaration #define?

Répondre

12

En C# #define les macros, comme certains des exemples de Bernard, ne sont pas autorisées. La seule utilisation courante de #define/#if s en C# est l'ajout d'un code de débogage optionnel. Par exemple:

 static void Main(string[] args) 
     { 
#if DEBUG 
      //this only compiles if in DEBUG 
      Console.WriteLine("DEBUG") 
#endif 
#if !DEBUG 
      //this only compiles if not in DEBUG 
      Console.WriteLine("RELEASE") 
#endif 
      //This always compiles 
      Console.ReadLine() 
     } 
1

Bien, les définitions sont souvent utilisées pour les constantes de temps de compilation et les macros. Cela peut rendre votre code un peu plus rapide car il n'y a vraiment aucun appel de fonction, les valeurs de sortie des macros sont déterminées au moment de la compilation. Les # if sont très utiles. L'exemple le plus simple auquel je puisse penser est la recherche d'une version de débogage pour ajouter de la journalisation ou de la messagerie supplémentaire, peut-être même des fonctions de débogage. Vous pouvez également vérifier différentes variables d'environnement de cette façon.

D'autres avec plus d'expérience en C/C++ peuvent en ajouter plus j'en suis sûr.

1

Je me retrouve souvent à définir certaines choses répétitives dans certaines fonctions. Cela rend le code beaucoup plus court et permet ainsi une meilleure vue d'ensemble.

Mais comme toujours, essayez de trouver une bonne mesure pour ne pas en créer une nouvelle langue. Peut-être un peu difficile à lire pour l'entretien occasionnel plus tard.

8

#define est utilisé pour définir des constantes de compilation que vous pouvez utiliser aveC#if pour inclure ou exclure des morceaux de code.

#define USEFOREACH 

#if USEFOREACH 
    foreach(var item in items) 
    { 
#else 
    for(int i=0; i < items.Length; ++i) 
    { var item = items[i]; //take item 
#endif 

     doSomethingWithItem(item); 
    } 
1

@Ed: Lorsque vous utilisez C++, il est rarement un avantage pour l'utilisation #define sur les fonctions inline lors de la création de macros. L'idée de "plus grande vitesse" est une idée fausse. Avec les fonctions inline, vous obtenez la même vitesse, mais vous obtenez également le type safey et aucun effet secondaire de "coller" du préprocesseur car les paramètres sont évalués avant que la fonction soit appelée (par exemple, essayez d'écrire la macro MAX omniprésente , et appelez-le comme ceci: MAX (x ++, y) .. vous verrez ce que je reçois à).

Je n'ai jamais eu besoin d'utiliser #define dans mon C#, et je l'utilise très rarement pour autre chose que la version de la plate-forme et du compilateur qui vérifie la compilation conditionnelle en C++.

3

est-#define la seule chose qui détermine si le code est inclus lors de la compilation? Si j'ai #define DEBUGme en tant que symbole personnalisé, la seule façon de l'exclure de la compilation est supprimer cette déclaration #define?

Vous pouvez undefine symboles et

#if defined(DEBUG) 
#undef DEBUG 
#endif 
0

Peut-être Les usées les plus courantes de #define en C# est de faire la différence entre debug/release et les plates-formes différentes (par exemple Windows et X-Box 360 dans la Cadre XNA).

0

Il est pour la compilation conditionnelle, donc vous pouvez inclure ou supprimer des morceaux de code basés sur les attributs du projet qui ont tendance à être:

  • plate-forme prévue (Windows/Linux/XB360/PS3/Iphone .... etc)
  • Release ou debug (journalisation en général, assène etc ne sont inclus dans une version de débogage)

Ils peuvent également être utilisés pour désactiver une grande partie d'un système rapide, par exemple, au cours du développement d'un jeu , Je pourrais définir

#define PLAYSOUNDS 

puis enveloppez le dernier émette un son dans:

#ifdef PLAYSOUNDS 
// Do lots of funk to play a sound 
return true; 
#else 
return true; 

Il est donc très facile pour moi à activer et désactiver la lecture des sons pour une construction. (En règle générale, je ne joue pas de sons lors du débogage car cela gêne ma musique :)) L'avantage est que vous n'introduisez pas de branche en ajoutant une instruction if ....

Questions connexes