预处理指令

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


时间: 2024-11-08 22:00:55

预处理指令的相关文章

VC预处理指令与宏定义

一个经典的例子 使用预处理与宏定义最经典的例子莫过于加在一个头文件中以避免头文件被两次编译.试想这种的情况,有一个文件headerfile.h 它被包含在headerfile1.h中,同时在headerfile2.h 中也被包含了,现在有一个CPP文件,implement.cpp 包含了headerfile1.h 和headerfile2.h: #include "headerfile1.h" #include "headerfile2.h" 假设headerfil

C#中的预处理指令

与C++不同,C#没有独立的预处理器.C#中的预处理指令(pre-processing directives)仅仅用来与C保持一致,而并不是编译器开始编译代码之前的一个单独的处理步骤,它是作为词法解析的一部分来执行的. 预处理指令都以#号开头并位于行首(前面可以出现空格符).在介绍条件编译之前,我们先学习两条用于定义符号和取消符号定义的预处理指令:#define和#undef. #define指令对于有一点C语言知识的读者来说再熟悉不过,它非常类似于C中的宏定义: #define COUNT 这

c/c++预处理指令总结

常见的预处理功能: 预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见的预处理有:文件包含,条件编译.布局控制和宏替换4种. 文件包含:#include 是一种最为常见的预处理,主要是做为文件的引用组合源程序正文. 条件编译:#if,#ifndef,#ifdef,#endif,#undef等也是比较常见的预处理,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制.防止对文件重复包含的功能. 布局控制:#progma,这也是我们应用预处理的一个重要方面,

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 #line default char c; // CS0168 on line 9

C/C++预处理指令#pragma详解

      在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C ++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的.其格式一般为: #Pragma Para其中Para 为参数,下面来看一些常用的参数.      (1)message 参数. Message 参数是我最喜欢的一个参数,它能够在编

预处理指令中#Pragma

在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的. 其格式一般为: #pragma Para.其中Para 为参数,下面来看一些常用的参数 1.message 参数 Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息

代码 c++-预处理指令错误的问题

问题描述 预处理指令错误的问题 #ifndef_Tree_h #define_Tree_h 为什么编译的时候出现预处理指令错误的提示?写错了吗?不对的话怎么改? 解决方案 dssdfdsfdsf 解决方案二: dsfsdfdsfdfds 解决方案三: dsfsdfdsfdfds 解决方案四: dsfsdfdsfdfds 解决方案五: dsfsdfdsfdfds 解决方案六: dsfsdfdsfdfds

代码-预编译连接符##  预处理指令

问题描述 预编译连接符## 预处理指令 #include <stdio.h> #include<stdlib.h> #define TR(m,n,p) m##n##p int main () { printf("%sn",TR("abc","xy","yz")); return 0; } 这段代码为什么编译不过? 解决方案 gcc?那好像要定义2个宏,可以看看这个解释http://www.cnblogs

常用C/C++预处理指令详解_C 语言

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