#if
、#elif
、#else
和 #endif
指令提供的條件編譯功能是通過預處理表達式(第 2.5.1 節)和條件編譯符號來控制的。
條件編譯符號有兩種可能的狀態:已定義的或未定義的。在源文件詞法處理開始時,條件編譯符號除非已由外部機制(如命令行編譯器選項)顯式定義,否則是未定義的。當處理 #define
指令時,在指令中指定的條件編譯符號在那個源文件中成為已定義的。此後,該符號就一直保持已定義的狀態,直到處理一條關於同一符號的 #undef
指令,或者到達源文件的結尾。這意味著一個源文件中的 #define
和 #undef
指令對同一程序中的其他源文件沒有任何影響。
當在預處理表達式中引用時,已定義的條件編譯符號具有布爾值 true
,未定義的條件編譯符號具有布爾值 false
。不要求在預處理表達式中引用條件編譯符號之前顯式聲明它們。相反,未聲明的符號只是未定義的,因此具有值 false
。
條件編譯符號的命名空間與 C# 程序中的所有其他命名實體截然不同。只能在 #define
和 #undef
指令以及預處理表達式中引用條件編譯符號。