c#预处理指令分析

预处理指令

这些指令/命令不会转换为可执行代码,但会影响编译过程的各个方面;列如,可以让编译器不编译某一部分代码等。

C#中主要的预处理指令

#define和#undef

#define指令定义:

#define DEBUG

它告诉编译器存在DEBUG这个符号;这个符号不是实际代码的一部分,而只是在编译器编译代码时候可能会根据这个符号做条件编译。

#undef定义:

#undef DEBUG

用来移除定义的符号DEBUG。如果不存在这样的标记,#undef指令则不会生效。同样,用#define再次定义一个同名的标记也不会有任何变化。

注意:

  • 你需要将#define和#undef指令写在实际业务代码开始之前的位置。
  • #define本身没有什么用,需要和其他预处理器指令结合使用;比如 #if

#if, #elif, #else和#endif

这些指令告诉编译器是否要编译包含在其中的代码块。例如:

int DoSomeWork(double x)
{
  // do something
  #if DEBUG
    Console.WriteLine($"x is {x}");
  #endif
}

这段代码中的Console.Writeline语句,只有在前面用#define指令定义了符号DEBUG后才会在编译的时候,真正被编译到;

如果编译器没发现DEBUG符号,就会在编译的时候忽略这句代码。 

#elif(= else if)和#else指令可以用在#if块中:

#define ENTERPRISE
#define W10
// further on in the file
#if ENTERPRISE
// do something
  #if W10
  // some code that is only relevant to enterprise
  // edition running on W10
  #endif
#elif PROFESSIONAL
// do something else
#else
// code for the leaner version
#endif

#if和#elif还支持有限的一些逻辑操作符,你可以用使用!,==,!=和||等。

一个标记如果存在,则认为是true,如果没有定义,就认为是false,因此你也可以这样使用:


#if W10 && (ENTERPRISE==false) // if W10 is defined but ENTERPRISE isn't

#warning和#error

当编译器遇到#warning的时候,会产生警告信息;

当编译器遇到#error的时候,会产生错误信息;

  class Program
  {
    static void Main(string[] args)
    {

#warning this is a warning message which will be shown when compile

      Console.WriteLine("Hello World!");

#error this is a error message, and will break build
    }
  }

编译结果:

Program.cs(10,10): warning CS1030: #warning: 'this is a warning message which will be shown when compile' [/define_warning/define_warning.csproj]
Program.cs(14,8): error CS1029: #error: 'this is a error message, and will break build' [/define_warning/define_warning.csproj]
1 Warning(s)
1 Error(s)

  使用这些指令可以检查#define语句是不是做错了什么事,使用#warning可以提醒要做些事情:

#if DEBUG && RELEASE
#error "You've defined DEBUG and RELEASE simultaneously!"
#endif
#warning "Don't forget to remove this line before the boss tests the code!"
Console.WriteLine("*I love this job.*");

#region和#endregion

可以用来标识一段代码,在Visual Studio或其他能够识别的IDE里比较有用。

#region Member Field Declarations
int x;
double d;
Currency balance;
#endregion

#line

#line指令可以用来改变编译器输出警告和错误时相应的文件名和行号信息。这个实际中,用的可能会比较少。

主要是在用第三方包的时候,有时候会导致编译器报告的行号或文件名与实际不匹配。

#line可以用于还原这种匹配。

#line 164 "Core.cs" // We happen to know this is line 164 in the file Core.cs,
// before the intermediate package mangles it.
// later on
#line default // restores default line numbering

#pragma

#pragma指令可以用来终止或恢复某个指定编号到编译器警告。

与命令行选项不同,#pragma指令可以在类或方法级别实现。

例如:

class Program
{
  static void Main(string[] args)
  {
    int i = 0;
    Console.WriteLine("Hello World!");
  }
}

  编译是会有warning:

Program.cs(9,17): warning CS0219: The variable 'i' is assigned but its value is never used [/define_warning/define_warning.csproj]
1 Warning(s)
0 Error(s)  

从warning信息可以看出是warning CS0219,加入#pragma后就不会有warning了。

#pragma warning disable CS0219
  public class Program
  {
    static void Main(string[] args)
    {
      int i = 0;
      Console.WriteLine("Hello World!");
    }
  }
#pragma warning restore CS0219

注意:warning的代码是区分大小写的,CS2019要大写,如果写成cs2019则没有用。

以上就是c#预处理指令分析的详细内容,更多关于c#预处理指令的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#中变量、常量、枚举、预处理器指令知多少

    一.变量 C#共有其中变量类型有:静态变量.实类变量.数组元素.数值参数.引用参数.输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { private static uint variableUInt; public static uint VariableUInt { get => variableUInt; set => variableUInt = value; } string VariableStr; public Var

  • C#中的预处理器指令详解

    目录 1. #define 和 #undef 2. #if.#elif.#else 和#endif 3. #warning 和 #error 4. #region 和#endregion 5. #line 6. #pragma C#中有许多名为"预处理器指令"的命令.这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面. 例如,使用预处理器指令可以禁止编译器编译代码的某一部分.如果计划发布两个版本的代码,即基本版本和拥有更多功能的企业版本,就可以使用这些预处理器指令.在

  • C#预处理器指令的用法实例分析

    本文实例讲述了C#预处理器指令的用法.分享给大家供大家参考.具体用法分析如下: C#预处理器指令是在编译时调用的.预处理器指令(preprocessor directive)告诉C#编译器要编译哪些代码,并指出如何处理特定的错误和警告.C#预处理器指令还可以告诉C#编辑器有关代码组织的信息. 1. 定义符号和取消符号定义的预处理指令#define 和 #undef 预处理指令都以#号开头并位于行首前面可以出现空格符. 复制代码 代码如下: #define DEBUG #define ISSAY

  • c#预处理指令分析

    预处理指令 这些指令/命令不会转换为可执行代码,但会影响编译过程的各个方面:列如,可以让编译器不编译某一部分代码等. C#中主要的预处理指令 #define和#undef #define指令定义: #define DEBUG 它告诉编译器存在DEBUG这个符号:这个符号不是实际代码的一部分,而只是在编译器编译代码时候可能会根据这个符号做条件编译. #undef定义: #undef DEBUG 用来移除定义的符号DEBUG.如果不存在这样的标记,#undef指令则不会生效.同样,用#define再

  • 常用C/C++预处理指令详解

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

  • 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       

  • .net 预处理指令符的使用详解

    什么是预处理指令符? 当C#编译器找到一条预处理指令#if,最后找到一条指令时,#endif仅在定义了指定符号的情况下,编译器才会在这些指令之间编译代码.与C和C ++不同,您不能将数字值分配给符号.#if C#中的语句为布尔型,仅测试符号是否已定义. 预处理指令符的使用 #if:打开条件编译,仅在定义了指定符号的情况下才编译代码. #elif:根据是否定义了指定的符号,关闭前面的条件编译并打开新的条件编译. #else:如果未定义先前指定的符号,则关闭之前的条件编译并打开新的条件编译. #en

  • C语言超全面define预处理指令的使用说明

    目录 前言 #define 定义宏(无参) #define 定义宏函数 宏的更多规则特性 宏的缺点 常见预处理指令 前言 C语言中源代码到可执行文件的第一阶段,也就是预处理阶段,会检查源文件中的预处理指令语句和宏定义,并对源代码进行相应的替换,预处理过程还会删除程序中的注释和多余的空白符号. 预处理指令是以#开头的代码行,#必须是该行除了空白符外的第一个字符,#后是指令关键字,在#和指令关键字之间允许存在若干个空白字符,define是宏定义命令.在C语言程序中允许用一个标识符来表示一个字符串,称

  • C语言编程之预处理过程与define及条件编译

    目录 名示常量#define 重定义常量 在#define中使用参数 预处理器粘合剂:##运算符 变参宏:- 和_ _ VAG_ARGS_ _ 宏与函数 预处理指令 #undef指令 从C预处理器的角度看已定义 条件编译 offsetof函数 这张图描述了从源文件到可执行文件的整体步骤 这张图展示了大体上步骤. 从代码到运行环境,编译器提供了翻译环境.在一个程序中,会存在多个文件 ,而每个源文件都会单独经过编译器处理. 预编译: 1,会将#include等头文件所包含的内容,库函数全部拷贝过来

  • C语言的预处理介绍

    目录 前言 一.预定义符号 二.#define 1.宏 2.宏与函数 3.带副作用的宏参数 4. 宏和函数的不同 5.#undef 三.条件编译 四.文件包含 总结 前言 编译一个C语言程序涉及很多步骤.其中第一个步骤被称为预处理.C语言的预处理器在源代码编译之前对其进行一些文本性质的操作.它的主要任务包括删除注释.插入被#include指令包含的文件内容.定义和替换由#define指令定义的符号,同时确定代码的部分内容是否应该根据一些条件编译指令进行编译. 一.预定义符号 下表为C语言预处理器

  • 详解C语言的预处理效果

    目录 前言 一.预定义符号 二.#define 1.宏 2.宏与函数 3.带副作用的宏参数 4. 宏和函数的不同 5.#undef 三.条件编译 四.文件包含 1.函数库文件包含 2.本地文件包含 总结 前言 编译一个C语言程序涉及很多步骤.其中第一个步骤被称为预处理.C语言的预处理器在源代码编译之前对其进行一些文本性质的操作.它的主要任务包括删除注释.插入被#include指令包含的文件内容.定义和替换由#define指令定义的符号,同时确定代码的部分内容是否应该根据一些条件编译指令进行编译.

  • vue-cli的webpack模板项目配置文件分析

    由于最近在vue-cli生成的webpack模板项目的基础上写一个小东西,开发过程中需要改动到build和config里面一些相关的配置,所以刚好趁此机会将所有配置文件看一遍,理一理思路,也便于以后修改配置的时候不会"太折腾". 一.文件结构 本文主要分析开发(dev)和构建(build)两个过程涉及到的文件,故下面文件结构仅列出相应的内容. ├─build │ ├─build.js │ ├─check-versions.js │ ├─dev-client.js │ ├─dev-ser

随机推荐