c#预处理指令分析
作者:编码者频道 发布时间:2021-07-23 10:35:00
预处理指令
这些指令/命令不会转换为可执行代码,但会影响编译过程的各个方面;列如,可以让编译器不编译某一部分代码等。
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则没有用。
来源:https://www.cnblogs.com/codesee/p/13096327.html?utm_source=tuicool&utm_medium=referral


猜你喜欢
- 本文实例讲述了Java面向接口编程之简单工厂模式。分享给大家供大家参考,具体如下:一 代码interface Output{ /
- 前言:线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据
- 引言为了让我更快的熟悉代码,前段时间组长交代了一个小任务,大致就是让我整理一下某个模块中涉及的 sql,也是方便我有目的的看代码,也是以后方
- 类和结构是.NET Framework中的同样类型系统的两种基本构造。两者在本质上都属于数据结构,封装这一组整体作为一个逻辑单位的数据和行为
- 对于springboot应用,需要以下几个步骤springboot应用开启endpoint,添加actuator的以来和promethus的
- 文件写入为提供相对较高性能的文件读写操作,这里果断选择了 NIO 对文件的操作,因为业务背景需要数据的安全落盘。这里主要采用 ByteBuf
- mybatis-plus Condition拼接Sql语句各方法1.setSqlSelect—用于添加查询的列信息public Wrappe
- 概述这里是Mac环境,如果是window环境的同学,在环境搭建和工具上可以选择Window环境的。先看看需要到的工具;1、apktool:h
- 双向信号和竞赛(Two-Way Signaling and Races) Monitor.Pulse方法的一个重要特性是它是异步执
- 本文实例为大家分享了java数独游戏的具体代码,供大家参考,具体内容如下自己写的数独游戏,共9关,代码如下:1、DoShudu类用于产生数独
- 一、 * 与过滤器在讲Spring boot之前,我们先了解一下过滤器和 * 。这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较
- 1.预警需求为了更好的管理商品日期,需要对仓库的商品进行预警管理,对商品的保质期控制在一个范围内提示出来,也可以通过该功能间接的展示出一个商
- Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现"
- 题目从命令行读入两个数组的长度和数组的值,其中第一行两个数na和nb代表aa和bb数组的长度代码import java.util.Scann
- 最近做的一个小东西遇到这样的情况,我从一个页面MainActivity修改一些内容,需要跳转到一个新的EditActivity去做修改操作,
- 推荐激活教程IntelliJ IDEA 2020最新激活码(亲测有效,可激活至 2089 年)最新idea2021注册码永久激活(激活到21
- Maven的安装安装Maven之前要确保已经安装好了jdk,并且配置好了环境变量JAVA_HOME。具体安装步骤如下:1. 从ap
- 最近看代码,由于代码的调用层级深度比较多,层层深入到某处时,已经忘记了身处何处,虽然自己可以使用一些画图工具来时序图,但是,这种情况下,自己
- 本文实例讲述了Java 反射机制原理与用法。分享给大家供大家参考,具体如下:反射反射,程序员的快乐!1、什么是反射?Java反射就是在运行状
- 前言 前几天有在微博上推荐过一个博客,看他文章时发现了这个属性。有些属性不常用,但需要的时候非常有用,于是做了个例子,正好项目用到