23.7 #line指令
line指令是行号指令,使用该指令可以:
(1)重新指定编译器警告或错误信息中提示的行号,从图23-3中可以看到出现错误或警告的代码行数。
关于重新指定行号主要有两种指令语法。
line行号//重新指定当前行号
line default//重新恢复为默认行号
在指定了行号以后,在遇到"#line default"指令之前,之间的代码行将基于新的行号递增。例如,假设使用"#line 200"指定了当前行的行号为200,那么在警告或错误消息中显示的行号就是200,即使它原来的行号是10。后面代码的行号在遇到"#line default"之前都会基于200进行递增。如代码清单23-4所示。
代码清单23-4 #line指令示例代码
1 using System;
2
3 namespace ProgrammingCSharp4
4{
5 class Preprocessor
6{
7 static void Main()
8{
9#line 100
10#warning这是第1条自定义的警告消息
11#warning这是第2条自定义的警告消息
12#line default
13#warning这是第2条自定义的警告消息
14}
15}
16}
编译以后的结果如图23-4所示。
图 23-4 使用#line指令重新指定代码行的编译结果
可见,当在第9行代码处使用了"#line 100"指令后,从第10行开始就成了第100行,第11行就是101行,在第12行处遇到了"#line default"指令,第13行就不是102行了,恢复成了默认的第13行。
(2)重新指定被编译文件的文件名。
语法如下:
line行号“新文件名”
为了节省篇幅,在代码清单23-4的基础上修改,将第9行的代码改为如下代码:
line 100"NewFileName.cs"
再次编译可以看到如图23-5所示结果。
图 23-5 重新指定编译文件的文件名后的编译结果
可以看到第100行和第101行都是新的文件名"NewFileName.cs",直到遇到"#line default"指令,文件名和行号都恢复为了默认。
(3)可以对调试器隐藏若干连续的行。语法如下:
line hidden
使用了该指令后,其后的所有行都将对调试器隐藏。如果在这些行设置断点调试器将不会中断。同样,直到遇到"#line default"指令,也意味着"#line hidden"指令的结束。换句话说,"#line default"指令后的代码将恢复正常,可以正常的调试、中断。需要说明的是,该指令并不隐藏真实的文件名和行号。也就是说,在警告或错误消息中将使用真实的文件名和行号,如代码清单23-5所示。
代码清单23-5 对调试器隐藏连续行代码示例
1 using System;
2
3 namespace ProgrammingCSharp4
4{
5 class Preprocessor
6{
7 static void Main()
8{
9#line hidden
10 Console.WriteLine(“调试器不会在此停留”);
11 string str=“我也被隐藏了”;
12#line default
13 Console.WriteLine(“此处可以正常中断”);
14}
15}
16}
在上述代码中,在第9行使用了隐藏指令,那么从第10行开始,直到第13行之前都处于对调试器隐藏状态,也就是说在第10行到第12行之间设置的断点都不会中断,但是第13行的断点可以正常中断,如图23-6所示。
图 23-6 处于隐藏状态的代码无法设置断点