预处理指令

简介:

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


目录
相关文章
|
3月前
|
编译器 C#
C# 预处理指令
C# 预处理指令
21 0
|
6月前
|
安全 编译器 程序员
C语言(16)----预处理中的宏以及预处理指令
C语言(16)----预处理中的宏以及预处理指令
54 2
|
6月前
|
算法 C++ 开发者
【C/C++ 基础】条件编译相关的预编译指令
【C/C++ 基础】条件编译相关的预编译指令
50 0
|
6月前
|
编译器 C语言
预处理指令
预处理指令
38 0
|
编译器 C语言
预处理指令、typedef、条件编译、多文件代码
预处理指令、typedef、条件编译、多文件代码
75 0
|
C++ 测试技术
C++ 内置宏定义 与 预编译指令
内置宏和预编译指令, 在代码调试、单元测试、跨平台代码中经常会用到。这里记录一下。 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE____TIME__ __FUNCTION__ 2.
1028 0