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.
Syntaxe générale des directives
[modifier | modifier le wikicode]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 | modifier le wikicode]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 | modifier le wikicode]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 | modifier le wikicode]Pour ignorer un avertissement, la directive est la suivante :
#pragma warning disable codes
Où 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 | modifier le wikicode]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 | modifier le wikicode]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
Où codes
est la liste des codes des avertissements à restaurer.
Restaurer tous les avertissements
[modifier | modifier le wikicode]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 | modifier le wikicode]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 | modifier le wikicode]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 | modifier le wikicode]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 | modifier le wikicode]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