老田:但看這個申明符號確實沒有什麼用。不過當它和#if、#elif、#else、#endif這些預先處理指令結合起來之後,它的功能就非常強大了。
來看個樣本:
#define debug //嘗試注釋和取消注釋這一句,然後運行程式看效果
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace第二章_樣本
{
classProgram
{
staticvoid Main(string[] args)
{
#if debug
Console.WriteLine("確實申明了debug這個符號");
Console.ReadLine();
#else
Console.WriteLine("切,都沒有申明");
Console.ReadLine();
#endif
}
}
}
執行後效果2-6
圖2-6代碼輸入情況以及執行結果
小天:上面樣本示範的效果是,如果前面申明了debug這個符號,那麼最終效果會顯示"確實申明了debug這個符號",如果將前面申明符號的語句注釋掉,則結果為"切,都沒有申明"。可是,這能夠說明什麼呢?有什麼用啊?
老田:好好回憶下前面我們說的,是否是說預先處理指令的作用就是影響編譯器?換句話說,在上面你看到未顯示的代碼最終也不會被編譯器編譯。不會被編譯到程式,那麼程式的體積自然不會因為這段代碼而增大了。
另外需要注意的是,如果使用#if,那麼一定記得使用#endif來關閉哦,因為編譯器認為從#if開始後到#endif之間的代碼都是屬於#if或者#else的。如果忽略那一段,那麼久"噢嘢"了。
小天:明白了,娜還有個#elif是什麼意思?
老田:這不知道是哪個懶人發明的,#elif = else if 。同時,#if這系列判斷也支援邏輯運算子!、==、!= 。下面我們來修改上面的代碼。再申明一個符號debug1,下面的判斷也增加一個,代碼如下
#define debug //嘗試注釋和取消注釋這一句,然後運行程式看效果
#define debug1 //第二個樣本用的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace第二章_樣本
{
classProgram
{
staticvoid Main(string[] args)
{
#if debug && debug1==false //如果debug存在,同時debug1不存在
Console.WriteLine("確實申明了debug這個符號");
Console.ReadLine();
#elif debug1 //如果debug不存在,而debug1存在
Console.WriteLine("不錯哦,又申明了一個");
Console.ReadLine();
#else//如果兩個都不存在
Console.WriteLine("切,都沒有申明");
Console.ReadLine();
#endif
}
}
}
猜猜上面的代碼會顯示哪一個結果。
本文為天轟穿原著,轉載請註明出處及作者!