C# preprocessor directives: een praktische gids
C# preprocessor directives onder de knie
Ontdek hoe C# preprocessor directives compilatie, control flow en error handling sturen. Deze gids dekt elke directive, syntaxis, real-world voorbeelden en best practices.
Preprocessor directives zijn commando's die de compiler evalueert voordat de echte compilatie begint. Ze bepalen welke codesecties worden opgenomen, hoe waarschuwingen en fouten worden afgehandeld, en kunnen zelfs de compiler's zicht op regelnummers en bestandsnamen wijzigen.
In C# begint een directive met een #-symbool en strekt zich over één regel, beëindigd door een newline in plaats van een puntkomma.
| Directive | Beschrijving | Syntaxis |
|---|---|---|
#if | Evalueert een preprocessor expressie en neemt code op alleen als true. | #if expression code #endif |
#elif | Wordt na #if gebruikt om additionele expressies te testen. | #if expr1 code1 #elif expr2 code2 #endif |
#else | Voert uit wanneer geen van de voorgaande #if of #elif condities true zijn. | #if expr1 code1 #else code2 #endif |
#endif | Markeert het einde van een conditioneel blok. | #if expr code #endif |
#define | Definieert een nieuw symbool. | #define SYMBOL |
#undef | Verwijdert een eerder gedefinieerd symbool. | #undef SYMBOL |
#warning | Genereert een level-1 compiler waarschuwing. | #warning Your warning message |
#error | Veroorzaakt een compile-time error. | #error Your error message |
#line | Overschrijft regelnummer en bestandsnaam voor diagnostiek. | #line 50 "FakeProgram.cs" #endif |
#region | Creëert een uitklapbaar gebied in editors zoals Visual Studio. | #region Description code #endregion |
#pragma | Geeft speciale instructies aan de compiler (bijv. warnings enable/disable). | #pragma warning disable #endif |
Symbolen definiëren en undefiniëren
- #define creëert een symbool dat evalueert naar true in
#ifblokken. - #undef verwijdert een symbool, waardoor het evalueert naar false.
Voorbeeld: Een symbool definiëren
#define TESTING
Voorbeeld: Een symbool undefiniëren
#undef TESTING
Conditionele compilatie met #if, #elif, #else en #endif
#iftest een expressie; code erin wordt alleen gecompileerd als de expressie true is.- Expressies mogen logische operatoren (
&&,||,!) en symbolen gebruiken. #elifstelt testen van meerdere condities achtereen toe.#elsedraait wanneer geen van de voorgaande condities voldaan is.#endifbeëindigt het conditionele blok.
Praktisch voorbeeld
#define CSHARP #undef PYTHON using System; namespace Directive { class ConditionalDirective { static void Main(string[] args) { #if (CSHARP && PYTHON) Console.WriteLine("CSHARP and PYTHON are defined"); #elif (CSHARP && !PYTHON) Console.WriteLine("CSHARP is defined, PYTHON is undefined"); #elif (!CSHARP && PYTHON) Console.WriteLine("PYTHON is defined, CSHARP is undefined"); #else Console.WriteLine("CSHARP and PYTHON are undefined"); #endif } } }
Output: CSHARP is defined, PYTHON is undefined
Waarschuwingen en fouten genereren
#warningemiteert een user-defined compiler waarschuwing maar laat het programma doorgaan.#erroremiteert een fatale fout, compilatie stopt.
Waarschuwingsvoorbeeld
using System; namespace Directives { class WarningDirective { public static void Main(string[] args) { #if (!CSHARP) #warning CSHARP is undefined #endif Console.WriteLine("#warning directive example"); } } }
Output bevat een waarschuwingsregel maar de console tekst print.
Foutvoorbeeld
using System; namespace Directive { class Error { public static void Main(string[] args) { #if (!CSHARP) #error CSHARP is undefined #endif Console.WriteLine("#error directive example"); } } }
Output: build faalt met compile-time error; de laatste console regel wordt nooit uitgevoerd.
Diagnostische locaties aanpassen met #line
- Wijzigt het gerapporteerde regelnummer en bestandsnaam voor daaropvolgende waarschuwingen of fouten.
Voorbeeld
using System; namespace Directive { class LineDemo { public static void Main(string[] args) { #line 200 "AnotherProgram.cs" #warning Actual warning generated by Program.cs on line 10 } } }
Resultaat: Waarschuwing verschijnt als AnotherProgram.cs(200,22): warning CS1030: ...
Code organiseren met #region en #endregion
- Groepeert gerelateerde codeblokken, die in editors uitgeklapt kunnen worden.
- Kunnen niet overlappen met een ander
#region, maar mogen binnen een conditioneel blok staan.
Voorbeeld
using System; namespace Directive { class RegionDemo { public static void Main(string[] args) { #region Hello Console.WriteLine("Hello"); Console.WriteLine("Hello"); Console.WriteLine("Hello"); Console.WriteLine("Hello"); Console.WriteLine("Hello"); #endregion } } }
Output: vijf regels "Hello".
Geavanceerde compiler instructies met #pragma
- Staat fijnmazige controle over compiler gedrag toe.
- Veelvoorkomend gebruik:
#pragma warning disable– zet alle waarschuwingen uit.#pragma warning restore– zet waarschuwingen weer aan.- Specifieke waarschuwingsnummers kunnen getarget worden (bijv.
#pragma warning disable CS0168). #pragma checksum– genereert checksums voor debugging.
Voorbeeld
using System; namespace Directive { class PragmaDemo { public static void Main(string[] args) { #pragma warning disable #warning This is a warning 1 #pragma warning restore #warning This is a warning 2 } } }
Alleen de tweede waarschuwing wordt getoond.
Voor dieper inzicht, raadpleeg de officiële #pragma (C# reference).
C Taal
- 3D-printen vs CNC-bewerking: De juiste tool voor uw project kiezen
- Wat Staat SFM Voor in CNC-Bewerking?
- C# Keywords en Identifiers begrijpen: Regels, lijsten en best practices
- C++ variabelen, literalen en constanten: een uitgebreide gids
- C++ datatypes begrijpen: fundamentals, modifiers en best practices
- C Sleutelwoorden & Identifiers: Een Praktische Gids
- C Datatypes Uitgelegd: int, float, char en Meer – Een Complete Gids
- De C-preprocessor (CPP) begrijpen: Hoe het de compilatie vereenvoudigt
- Python Keywords en Identifiers: Gereserveerde woorden en naamconventies onder de knie krijgen
- Python Regular Expressions (re-module) – een praktische gids
- Python's time-module beheersen: functies, structs en praktische voorbeelden