老田:但看这个申明符号确实没有什么用。不过当它和#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
}
}
}
猜猜上面的代码会显示哪一个结果。
本文为天轰穿原著,转载请注明出处及作者!