Programmation C sharp/Directives du préprocesseur

Le préprocesseur est le traitement effectué par le compilateur pour modifier le fichier source (en mémoire seulement) avant de le compiler. Il permet une compilation conditionnelle (fonctions de deboggage à exclure quand l'application est finalisée, fonctionnalités selon des options, ...), il modifie donc la façon de compiler les fichiers sources.

Programmation C#
Programmation C#
Modifier ce modèle

Syntaxe générale des directives

modifier

Une directive est toujours placée seule sur une ligne de texte et commence par le caractère dièse ( # ). Le premier mot identifie la directive. Il est éventuellement suivi de paramètres.

Exemple :

 #pragma warning disable

La directive pragma est suivie des paramètres warning et disable.

Portée des directives

modifier

La portée d'une directive commence à partir de la ligne qui suit cette directive, jusqu'à la fin du fichier source, ou la prochaine contre-directive.

Avertissements du compilateur

modifier

Lors de la compilation, des avertissements sont générés pour attirer le programmeur sur certaines instructions du fichier source potentiellement ambiguës ou dangereuses. Si le programmeur, après vérification de l'endroit indiqué, estime que le danger potentiel ne peut arriver, ou qu'il s'agit bien de ce qu'il faut faire, il est possible d'enlever les avertissements dans une zone du fichier source afin que les avertissements inutiles ne soit plus générés.

Ignorer un avertissement

modifier

Pour ignorer un avertissement, la directive est la suivante :

#pragma warning disable codes

codes est la liste des codes des avertissements à ignorer. Ces codes correspondent à ceux affichés par le compilateur, sans le préfixe "CS".

Ignorer tous les avertissements

modifier

Pour ignorer tous les avertissements, la directive est la même que la précédente, sans aucun code :

#pragma warning disable

Restaurer un avertissement

modifier

Pour restaurer la génération d'un avertissement, c'est à dire ne plus l'ignorer, la directive est la suivante :

#pragma warning restore codes

codes est la liste des codes des avertissements à restaurer.

Restaurer tous les avertissements

modifier

Pour restaurer tous les avertissements, la directive est la même que la précédente, sans aucun code :

#pragma warning restore

Symboles de compilation

modifier

Un symbole est défini avec la directive #define. Il possède un nom mais ne peut prendre de valeur en C#, à la différence d'autres langages comme le C ou le C++.

La syntaxe est la suivante :

#define nom_du_symbole 

Le symbole est défini jusqu'à la fin ou jusqu'à la directive #undef correspondante. La syntaxe de cette directive est la suivante :

#undef nom_du_symbole

Exemple :

#undef MAX_PAGES


Compilation conditionnelle

modifier

La syntaxe générale des directives de compilation conditionnelle est la suivante :

#if condition
    à compiler si la condition est vraie

#elif condition
    sinon, à compiler si la condition est vraie

...#elif...

#else
    à compiler sinon

#endif

Les blocs #elif et #else sont optionnels.

La condition peut avoir l'une des syntaxes suivantes :

nom_symbole
Retourne vrai si le symbole spécifié est défini.
!condition
Retourne vrai si la condition est fausse, et vice-versa.
condition && condition
Retourne vrai si les deux conditions sont vraies (ET logique).
condition || condition
Retourne vrai si au moins l'une des deux conditions est vraie (OU logique).
(condition)
Priorité d'évaluation.

La compilation conditionnelle est souvent utilisée pour les fonctions de déboggage. Par exemple :

#if DEBUG
// Fonction de déboggage
public void trace(string message)
{
    Console.WriteLine(message);
}
#endif

public void traitement()
{
#if DEBUG
     trace("Début de la fonction traitement()");
#endif
     ...
#if DEBUG
     trace("Fin de la fonction traitement()");
#endif
}

Pour ce genre de condition, l'attribut Conditionnal est plus simple à utiliser :

// Fonction de déboggage
[Conditionnal("DEBUG")]
public void trace(string message)
{
    Console.WriteLine(message);
}

public void traitement()
{
     trace("Début de la fonction traitement()");
     ...
     trace("Fin de la fonction traitement()");
}

Générer une erreur ou un avertissement

modifier

Il est possible qu'une certaine combinaison de symboles n'ait pas de sens, ou ne devrait pas être utilisée. Pour prévenir ce risque, en testant la condition correspondante, il est possible de générer une erreur ou un avertissement à la compilation, en utilisant les directives suivantes :

  • Pour générer une erreur :
#error message
  • Pour générer un avertissement :
#warning message

Délimiter une région du code

modifier

Délimiter une région sert à regrouper des lignes de codes (méthodes, classes, ...). Les régions de code sont utilisés dans les éditeurs de code spécialisés (Visual Studio, ...) pour permettre leur réduction. Lorsque la région est cachée, trois points de suspension apparaissent à la place des lignes contenues dans la région. Ces lignes apparaissent dans une bulle d'information lorsque le curseur de la souris passe sur ces trois points de suspension.

La syntaxe est la suivante :

#region description courte de la région de code
...
#endregion