文档章节

预处理指令

NoMasp
 NoMasp
发布于 2015/09/08 21:51
字数 895
阅读 2
收藏 0

C#预处理指令基本概念

虽然同C和C++的术语“预处理指令”名称一样,但C#的其实并没有单独的预处理步骤,也就是说在VS等环境中并没有预处理的编译器。

预处理指令能够用于替换源文件中的信息。以#(Sharp)字符和预处理指令名称开头。例如:

#define MAX

习惯于将预处理指令的名称全部设为大写。和C与C++不同的是,C#中的预处理指令的名称后不加数字等。C\C++所支持的宏函数在C#中也是不支持的。

还可以使用#region来设置一个区域,同时也可以通过Visual Studio让代码折叠。往往在#region后加上该区域的名称的字符串,可以实现注释的作用。

#region C#预处理指令
#endregion

5个预处理指令

1.#undef

上面我们使用了#define,其实还是有#undef的。那么它又是做什么的呢?

#define MAX
static void Main(string[] args)  
{
    #if (MAX) 
       Console.WriteLine("MAX已经定义了。");
    #endif
}

如果我们Debug程序,就会在控制台看到这样一条:

MAX已经定义了。

如果我们Release程序,得到的结果也还是一样的,但是如果在代码开头加上:

#undef MAX

再来Debug控制台就不会有消息提示了。

2.#if、#else、#elif

如果想要控制台显示MAX没有定义的情况,那就用#else来搭配#if就可以了。

#if (MAX) 
    Console.WriteLine("MAX已经定义了。");
#else 
    Console.WriteLine("MAX还没有定义。");
#endif

或许你在键入#else的时候也看到了#elif,这个自然就是对应的else if了。它们的逻辑和常规的if套装是一样的。

#define MAX
#undef MAX
#define MIN

static void Main(string[] args)   
{
#if (MAX) 
     Console.WriteLine("MAX已经定义了。");
#elif (MIN) 
     Console.WriteLine("MIN已经定义了。");
#else 
     Console.WriteLine("MAX还没有定义。");
#endif 
     Console.ReadLine();        
}

3.#warning、#error

这两个预处理指令用于抛出异常和错误。

#warning 这是一个强制抛出的异常。

这里写图片描述

#error 这是一个强制抛出的错误。

这里写图片描述

4.#line

我们还可以用#line将以下#error这行代码的行数设置为10000行,并将文件名设置为”错误“。

static void Main(string[] args)     
{
#line 10000 "错误"
#error 这是一个强制抛出的错误。  
}

这里写图片描述

如果我们再添加这样一行代码,则会将行数和文件名恢复为默认的。

#line 10000 "Error"
#error 这是一个强制抛出的错误。
#line default
#warning 这是一个强制抛出的警告。

这里写图片描述

5.#pragma

我们先在Program类前加上这样一行代码,它会引发CS3021错误。

 [CLSCompliant(false)]    

然后我们在上面这行代码前加入以下这行代码,其作用是禁用warning 3021。那么再次Debug就会发现原本的错误已经不在了。

#pragma warning disable 3021 

如果想要在后文中恢复这个CS3021错误,就用restore即可。

#pragma warning restore 3021 

以下是完整代码。

#pragma warning disable 3021 
  [CLSCompliant(false)]    
  class Program    
  {                             
      static void Main(string[] args)        
      {}
  }
#pragma warning restore 3021 
  [CLSCompliant(false)]    
  public class OtherProgram    
  {                            
      public static void OtherMain()        
      {}
  }

这个预处理指令其实是非常复杂的,在各大百科上已经有了相关介绍,以下是维基百科上的。传送门:pragma once



感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/44958099

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
加载中

评论(0)

c++教程(二十四:Preprocessor directives)

———————————————————————— 该系列教程为翻译c++官方教程,点击参考英文原版,水平有限,翻译不通之处敬请谅解! ————————————————————————...

on2way
2017/02/07
0
0
C语言 条件编译详解

预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 在C 语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含...

晨曦之光
2012/03/09
281
0
Objective-C中的预处理器指令与宏

引 什么是预处理器,跟我有什么关系? 预处理器是在OC源文件编译过程中的一个部分,而且是第一个处理部分,预处理器的预也由此可见。 整个编译过程可以大致分为:预处理器进行词法分析 -> 语...

cloudox_
2017/04/26
0
0
C/C++程序编译流程(预处理->编译->汇编->链接)

程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件...

oldpan
2017/09/10
0
0
C语言基础-07-预处理指令1-宏定义

预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编...

Corwien
2016/03/16
10
0

没有更多内容

加载失败,请刷新页面

加载更多

如何创建spring-boot的web项目

第一步:新建一个maven项目 新建项目,选择maven 填写GroupId和ArtifactId 下一步默认即可,直接点击finish 创建完成后项目结构如下 第二步: 配置pom.xml 在pom.xml中添加如下代码: <p...

幻境fairy
10分钟前
46
0
「网易官方」极客战记(codecombat)攻略-地牢-Kithgard 斗殴-kithgard-brawl

每次你从一波波的敌人中存活下来,就会变得更难。但是你如果你输了,你必须要等一天后才能再次提交。 简介 这是一个无尽的挑战关卡,敌人会一波波地向你发起进攻,一次比一次强大,直到你坚持...

极客战记
13分钟前
68
0
基于数据回放功能开发的线性挂单流策略

前言 人们常说,交易是一门艺术,而艺术来源于灵感。所以今天想和大家分享一下,如何利用发明者量化数据回放功能,发掘自己的交易灵感。 交易的灵感和盘感 通常我们所说的灵感,是指人们在思...

发明者量化
17分钟前
40
0
技术答疑丨如何区分游戏短音乐与音效以及配音

在游戏的声音领域,一般游戏音乐、音效与配音,但是每个类别又有不同的细分,在我们奇亿音乐与游戏厂商的日常沟通中,发现这些问题一直困扰着大家,一起来看看吧。 1、如何区分游戏的音效与配...

奇亿音乐
18分钟前
66
0
如何在mac上录屏

新上手的苹果电脑,想要完成录屏操作还不知道从哪下手的小伙伴有福利了,小编今天分享如何在mac上录屏内容,需要的来一起了解吧~ 如何在mac上录屏 Aiseesoft Screen Recorder for Mac(录屏软...

麦克虾仔
30分钟前
48
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部