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.7 #line指令 - 图1

图 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.7 #line指令 - 图2

图 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.7 #line指令 - 图3

图 23-6 处于隐藏状态的代码无法设置断点