首页 > 编程语言 >C#教程 - 预处理指令(Preprocessor Directives)

C#教程 - 预处理指令(Preprocessor Directives)

时间:2022-09-23 08:56:07浏览次数:63  
标签:实例 nullable C# 编译 指令 Directives Preprocessor 警告 warning

更新记录
转载请注明出处:
2022年9月23日 发布。
2022年9月10日 从笔记迁移到博客。

预处理指令(Preprocessor Directives)说明

预处理指令(preprocessor directive)指示编译器如何处理源代码

作用是为编译器添加额外的编译信息

预处理器在编译时调用的指令,类似于条件运算表达式,不过是在编译时调用,不是在运行时调用,可以决定哪些语句进行编译

注意:

​ C#中本质上没有预处理程序,实际上是由编译器处理的,C/C++有实际预处理阶段

​ 预处理指令必须和C#代码在不同行

​ 与C#语句不同,预处理指令不需要分号结尾

​ 所有的预处理指令以#开头

​ 允许在预处理指令的末尾添加单行注释,不允许多行注释

实例:
image

定义全局预处理指令

打开.csproj 文件

写入配置文件

<PropertyGroup>
  <DefineConstants>DEBUG;ANOTHERSYMBOL</DefineConstants>
</PropertyGroup>

预处理指令集合

image

#nullable option

编译符号定义符号(Defines &Undefines Symbol)

编译符号只能是两种状态,要么被定义,要么未定义

注意:

​ 编译符号定义指令只能放置在C#源文件第一行

​ 可以是除true和false之外的任何标识符,包括C#关键字

​ 编译符号定义的是标志符号,没有值(C/C++有值)

​ 编译符号定义只在单个C#源文件内有效

​ 编译符号定义可以重复定义,即可以定义多次

在编译器的命令行中使用定义符号

>dotnet.exe -define:CSHARP2PLUS TicTacToe.cs

语法:

#define 符号    //指令声明一个编译符号
#undef 符号     //指令取消声明一个编译符号

实例:

#define Panda666Plus
#undef Panda666Plus

实例:

#define CSHARP2PLUS

在项目配置文件中添加常量指令

打开项目配置文件.csproj

添加

<PropertyGroup>
<DefineConstants>DEBUG;ANOTHERSYMBOL</DefineConstants>
</PropertyGroup>

条件编译指令(Conditional Directives)

条件编译允许根据 某个编译符号是否被定义 或 表达式值 来选择编译或跳过代码

注意:

​ 条件是一个返回true或false的简单表达式

​ #if必须和#endif配合使用

​ #if 和#elif条件编译指令可以和||, &&, ! 运算符一起使用

C#中的4个条件编译指令:

#if
#elif
#else
#endif

示意图:
image

image

实例:
image

实例:检测windows系统

#if WINDOWS
//code
#endif

实例:检测Linux系统

#if LINUX
//code
#endif

实例:检测Linux系统 和 Windows系统

#if LINUX
//code
#elif WINDOWS
//code
#endif

实例:检测调试模式

#if DEBUG
//code
#endif

实例:检测发布模式

#if RELEASE
//code
#endif

实例:条件指令 与 运算符 一起使用

#if TESTMODE && !DEBUG

实例:判断C#6以前版本

#if PRECSHARP6
#endif

诊断指令

诊断指令用于产生用户自定义的编译时警告及错误信息

C#中支持以下2个诊断指令:

#error
#warning

语法:

#error Message
#warning Message

注意:Message不需要引号包围

行号指令

行号指令可以:

​ 改变编译器警告和错误消息出现的行数

​ 改变被编译源文件的文件名

​ 对交互式调试器隐藏一些行

语法:

#line  integer          //设置下一行的行号为指定值,后面的在这个基础上递增
#line  “filename”       //设置文件名
#line  default          //从新设置为实际的行号和文件名
#line   hidden          //在断点调试器中隐藏代码
#line                   //停止在调试器中隐藏代码

实例:
image

实例:自定义行号

#line 113 "TicTacToe.cs"

实例:恢复行号

#line default

区域指令

区域指令用于标注一段代码并为其命名,区域名是可选的,常用于在Visual Studio中进行折叠代码

语法:

#region 区域名
    //代码
#endregion

警告处理指令

警告处理指令允许我们关闭或开启警告信息

语法:

#pragma warning disable 警告号,警告号,….          //关闭警告
#pragma warning restore 警告号,警告号,….          //开启警告

注意:要关闭或开启所有警告号,可以不用带警告号参数

实例:

#pragma warning restore 618   //恢复618警告

image

image

实例:
开启禁用414错误警告

#pragma warning disable 414

恢复启用414错误警告

#pragma warning restore 414

实例:关闭和开启警告信息

public class Foo
{
 static void Main() { }
 #pragma warning disable 414
 static string Message = "Hello";
 #pragma warning restore 414
}

实例:显示警告信息

#warning    "Same move allowed multiple times."

实例:禁用警告

#pragma warning disable CS1030

实例:恢复警告

#pragma warning restore  CS1030

开启可空引用类型

#nullable option

实例:开启nullable

#nullable enable

实例:关闭nullable

#nullable disable

实例:恢复默认的nullable设置

#nullable restore

实例:开启引用类型可以nullable

#nullable enable
string[]? test2 = null;
#nullable disable

标签:实例,nullable,C#,编译,指令,Directives,Preprocessor,警告,warning
From: https://www.cnblogs.com/cqpanda/p/16712688.html

相关文章

  • 佳能Canon打印机G3800出现5B00错误代码提示,处理办法,G2800出现5B00废墨清零G1800出现5B
    使用佳能打印机时,经常会出现打印机错误,错误号码:5B00。出现这个错误的原因是打印机的废墨垫使用寿命已经达到了,系统芯片记录海绵吸收废墨计数达到临界值,所以会提示5B00的警......
  • JS 使用sessionStorage存取对象时显示[object object]的解决
    使用sessionStorage进行数据存取,如果数据是对象,则提取时为[objectobject],基于此问题,解决方法如下: 保存数据时window.sessionStorage.setItem("key",JSON.stringify(v......
  • HTML & CSS 设计原则
    设计原则DesignPrinciple响应式设计Responsive响应式设计的意思是网页能够根据其显示在的屏幕的大小自动伸缩。响应式设计使得对笔记本和手机用户更加友好。分辨率......
  • 2022.9.16———HZOI【CSP-S开小灶5】游寄
    \(Preface\)\(Rank46/41\)\(15pts+30pts=45pts\)\(\mathfrak{T1}\乌鸦喝水\)这个题的题意太坑人了,说的根本不清楚,样例也水,导致我挂成这弔样他的意思是,乌鸦一共飞......
  • 「游记」CSP 2022
    9.05+模拟赛日常考不过暴力老哥。天天挂分。烦死了。感觉人要没。9.16坑。9.18初赛。没报J组。S组完善程序中“归并第\(k\)小”的程序完全没看懂,于是填了\(5\)......
  • 2022.9.15———HZOI【CSP-S开小灶4】游寄
    Preface\(Rank31/39\)\(20pts+0pts=20pts\)最近出现了暴力不会打的情况我震惊我tm暴力不会打?然后其实仔细思考也是可以打的。只要暴力不是\(dp\)。但是赛时我老......
  • allure-commandline下载、安装、配置(windows版)
    allure-commandline用于打包测试报告allure-commandline下载下载地址:https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/选择:allure-commandl......
  • CSP - S2022笔试游寄
    时隔多天,我们仍未忘记那曾被$€€£$垃圾后台支配的恐惧Day-0.5我们下午考,上午\(J\)组的考试占了机房,就把我们赶去了微机教室,老机子,编译都得半天....于是闲的蛋疼就......
  • rsync
    rsync目录rsyncrsync简介rsync特性rsync的ssh认证协议备份的工具rsync命令rsync+inotifyrsync简介rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote......
  • cesium 入门指南
    最近拿到了几份offer,经过这次找工作发现自己最近脱节挺严重,为了后续的职业发展,决定开始书写博客记录自己的努力。cesium属于跨平台、跨浏览器的展现三维地球、地图的Java......