C#预处理指令之#line、#pragma warning

  #line

  #line 使您可以修改编译器的行号以及(可选)错误和警告的文件名输出。下面的示例说明如何报告与行号关联的两个警告。#line 200 指令强迫行号为 200(尽管默认值为 #7)。另一行 (#9) 作为默认 #line 指令的结果跟在通常序列后。

  class MainClass

  {

  static void Main()

  {

  #line 200

  int i; // CS0168 on line 200

  #line default

  char c; // CS0168 on line 9

  }

  }

  备注:

  #line 指令可能由生成过程中的自动中间步骤使用。例如,如果行从原始的源代码文件中移除,但是您仍希望编译器基于文件中的原始行号生成输出,则可以移除行,然后用 #line 模拟原始行号。 #line hidden 指令对调试器隐藏若干连续的行,这样当开发人员在逐句通过代码时,将会跳过 #line hidden 和下一个 #line 指令(假定它不是另一个 #line hidden 指令)之间的所有行。此选项也可用来使 ASP.NET 能够区分用户定义的代码和计算机生成的代码。尽管 ASP.NET 是此功能的主要使用者,但很可能将有更多的源生成器使用它。

  #line hidden 指令不会影响错误报告中的文件名或行号。即,如果在隐藏块中遇到错误,编译器将报告当前文件名和错误的行号。

  #line filename 指令指定您希望出现在编译器输出中的文件名。默认情况下,使用源代码文件的实际名称。文件名必须括在双引号 ("") 中。 源代码文件可以具有 #line 指令的任何编号。

  示例

  下面的示例说明调试器如何忽略代码中的隐藏行。运行此示例时,它将显示三行文本。但是,当设置如示例所示的断点并按 F10 键逐句通过代码时,您将看到调试器忽略了隐藏行。还请注意,即使在隐藏行上设置断点,调试器仍会忽略它。

  // preprocessor_linehidden.cs

  using System;

  class MainClass

  {

  static void Main()

  {

  Console.WriteLine("Normal line #1."); //这里设置断点

  #line hidden

  Console.WriteLine("Hidden line.");

  #line default

  Console.WriteLine("Normal line #2.");

  }

  }

  #pragma warning指令:允许我们关闭及重新开启警告消息

  在日常开发的过程中我们总是会经常对代码进行编译,而在编译的过程中会出现许多信息,许多无用的警告信息总是会在便一点过程中提示出来,以干扰一些主要的警告,对此也是可以通过预处理器指令来进行关闭来阻止其显示,常见的警告如下(CS0219、CS0681等):

  看一个例子:

  public class C

  {

  int i = 10;//警告:C.i已赋值,但从未使用过它的值

  [Obsolete("过期了",false)]

  public static void aa()

  {

  }

  static void Main()

  {

  int t=5; //警告:t已赋值,但其值从未使用

  aa(); //警告:过期了

  }

  }

  编译生成消息如下:


  注意:我所使用的是vs2010如果多次编译会自动将警告去除,如希望确保警告在输出中被显示,可以为项目做下清理:


  清理的作用就是将之前在bin目录中的程序集文件删除

  如果我们希望不显示上图红框内的警告,我们可以用#pragma warning 指令来消除这些警告

  在之前代码上添加预处理指令:

  #pragma warning disable 0618,0219,0414

  public class C

  {

  int i = 10;//警告:C.i已赋值,但从未使用过它的值得

  [Obsolete("过期了",false)]

  public static void aa()

  {

  }

  static void Main()

  {

  int t=5; //警告:t已赋值,但其值从未使用

  aa(); //警告:过期了

  }

  }

  再次生成的时候发现警告消失了...

  #pragma warning disable/restore 0618

  其中disable/restore分别代表了禁用和开启警告,而后面的编号则代表了警告的编号,此处编写警告编号时无需以“CS”开头。

  而这句代码只需书写在需要禁用或者开启的类文件中即可,这样此类对应的0618警告就不会出现了。

  但是需要注意的是#pragma warning只对单个文件有作用,如果想禁用多个文件的警告可以使用编译器的/nowarn指令,具体可以见MSDN:点我进入

  PS:#pragma 是一个单独的指令,而warning只是其中一个选项,#pragma的作用是:用于给编辑器提供特殊的指令,说明如何编译包含杂注的文件。

时间: 2024-10-28 00:02:20

C#预处理指令之#line、#pragma warning的相关文章

C/C++预处理指令#pragma详解

      在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C ++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的.其格式一般为: #Pragma Para其中Para 为参数,下面来看一些常用的参数.      (1)message 参数. Message 参数是我最喜欢的一个参数,它能够在编

预处理指令中#Pragma

在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的. 其格式一般为: #pragma Para.其中Para 为参数,下面来看一些常用的参数 1.message 参数 Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息

常用C/C++预处理指令详解_C 语言

预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查.预处理命令以符号"#"开头. 常用的预处理指令包括: 宏定义:#define 文件包含:#include 条件编译:#if.#elif.#ifndef.#ifdef.#endif.#undef 错误信息指令:#error #line指令 布局控制:#pragma 宏定义 宏定义又称为宏代换.宏替换,简称"宏".宏替换只作替换,不做计算,不做表达式求解.宏定义分带参数的宏定义和不带参数的宏

msvc/gcc:中用#pragma指令关闭特定警告(warning)

在使用一些第三方库或源码的时候,经常会遇到编译时产生warnings情况,这些warning不是我们自己的代码产生的,当然也不好去修改,但每次编译都显示一大堆与自己代码无关的警告也着实看着不爽,更麻烦的是还有可能造成自己代码中产生的警告被淹没在多过的无关警告中,而被忽略掉的情况. 所以要想办法关闭这些第三方代码和库产生的警告. 关闭特定的warning可以在编译时通过命令行参数的方式指定,比如 gcc 是在命令行一般是用-Wno-xxxx这样的形式禁止特定的warning,这里xxxx代入特定的

预处理指令

C#预处理指令基本概念 虽然同C和C++的术语"预处理指令"名称一样,但C#的其实并没有单独的预处理步骤,也就是说在VS等环境中并没有预处理的编译器. 预处理指令能够用于替换源文件中的信息.以#(Sharp)字符和预处理指令名称开头.例如: #define MAX 习惯于将预处理指令的名称全部设为大写.和C与C++不同的是,C#中的预处理指令的名称后不加数字等.C\C++所支持的宏函数在C#中也是不支持的. 还可以使用#region来设置一个区域,同时也可以通过Visual Studi

c/c++预处理指令总结

常见的预处理功能: 预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见的预处理有:文件包含,条件编译.布局控制和宏替换4种. 文件包含:#include 是一种最为常见的预处理,主要是做为文件的引用组合源程序正文. 条件编译:#if,#ifndef,#ifdef,#endif,#undef等也是比较常见的预处理,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制.防止对文件重复包含的功能. 布局控制:#progma,这也是我们应用预处理的一个重要方面,

VC预处理指令与宏定义

一个经典的例子 使用预处理与宏定义最经典的例子莫过于加在一个头文件中以避免头文件被两次编译.试想这种的情况,有一个文件headerfile.h 它被包含在headerfile1.h中,同时在headerfile2.h 中也被包含了,现在有一个CPP文件,implement.cpp 包含了headerfile1.h 和headerfile2.h: #include "headerfile1.h" #include "headerfile2.h" 假设headerfil

C#中的预处理指令

与C++不同,C#没有独立的预处理器.C#中的预处理指令(pre-processing directives)仅仅用来与C保持一致,而并不是编译器开始编译代码之前的一个单独的处理步骤,它是作为词法解析的一部分来执行的. 预处理指令都以#号开头并位于行首(前面可以出现空格符).在介绍条件编译之前,我们先学习两条用于定义符号和取消符号定义的预处理指令:#define和#undef. #define指令对于有一点C语言知识的读者来说再熟悉不过,它非常类似于C中的宏定义: #define COUNT 这

代码 c++-预处理指令错误的问题

问题描述 预处理指令错误的问题 #ifndef_Tree_h #define_Tree_h 为什么编译的时候出现预处理指令错误的提示?写错了吗?不对的话怎么改? 解决方案 dssdfdsfdsf 解决方案二: dsfsdfdsfdfds 解决方案三: dsfsdfdsfdfds 解决方案四: dsfsdfdsfdfds 解决方案五: dsfsdfdsfdfds 解决方案六: dsfsdfdsfdfds