老田:但看這個申明符號確實沒有什么用。不過當它和#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
}
}
}
猜猜上面的代碼會顯示哪一個結果。
本文為天轟穿原著,轉載請注明出處及作者!