导读

1、什么是预处理

2、预处理的好处

3、C#中的常见预处理指令

4、总结


什么是预处理

        在计算机科学中,预处理通常是指利用某一程序(通常是预处理器)对某一格式的源码(如.cs C#源代码)按照一些规则进行源码替换的过程。这个过程发生在词法分析阶段,得到的仍然是源码文件。对于编译而言简单来讲可分为三个阶段,词法分析、语法分析、可执行程序的生成。

上面是我自己的理解,可能不准确。PS我曾旁听过中科大两学期的编译原理课,但都是因为某些原因工作加班等没有一学期是坚持下去完整听完的,真心惭愧

预处理的好处

        这个有什么好处,我暂时还没归纳出来。日后补上

C#中的常见预处理指令

        C#中常见预处理指令可分为4类:

1、预处理符号定义指令 #define  和 #undef

2、条件编译指令 #if #elif #else #endif

3、诊断指令  #error 和 #warning

4、region 指令 #region  #endregion

现在一一说明

预处理定义符号

我们可以用 #define 定义预处理符号,用 #undef 取消预处理符号的定义,虽然编译器提供了这样的机制,但我不建议将预处理符号定义写在源代码中,因为这样就缺少变通性。C#编译器提供了一个命令可以将预处理符号的定义放在命令行参数中 csc /d:SybolName ..,推荐采用编译器命令参数的形式定义预处理符号

条件编译指令

#if #elif #else #endif 和C#语法if-elseif else 的语义类似,这里就不多说了。它支持 && || ! 登陆逻辑组合

我们看个例子  demo.cs

  1. // #define Debug_Mode1 // 定义预处理符号 Debug_Mode1
  2. // #undef Debug_Mode1 // 取消定义预处理符号 Debug_Mode1
  3. using System;
  4. class App
  5. {
  6. static void Main()
  7. {
  8. #if (Debug_Mode1 && !Debug_Mode2) // 只开启 Debug_Mode1
  9. Debug_Mode1();
  10. #elif (!Debug_Mode1 && Debug_Mode2) // 只开启 Debug_Mode2
  11. Debug_Mode2();
  12. #elif (Debug_Mode1 && Debug_Mode2) // 同时开启 Debug_Mode1和Debug_Mode2
  13. Debug_Mode1();
  14. Debug_Mode2();
  15. #else
  16. Console.WriteLine("正常运行");
  17. #endif
  18. }
  19.  
  20. #if(Debug_Mode1)
  21. static void Debug_Mode1()
  22. {
  23. Console.WriteLine("开启Debug_Mode1模式");
  24. }
  25. #endif
  26.  
  27. #if(Debug_Mode2)
  28. static void Debug_Mode2()
  29. {
  30. Console.WriteLine("开启Debug_Mode2模式");
  31. }
  32. #endif
  33. }

编译命令分别为

csc demo.cs

csc /d:Debug_Mode1 demo.cs

csc /d:Debug_Mode2 demo.cs

csc /d:Debug_Mode1,Debug_Mode2 demo.cs

运行效果分别为

 

诊断指令

格式

#error message

#waming message

message 可以是任何格式文本,比如中文

看代码  diaDemo.cs

  1. using System;
  2. #warning 编译代码前必须先Git代码 如已经Git过代码可无视
  3. class App
  4. {
  5. static void Main()
  6. {
  7. DebugInvoke();
  8. #if !Debug_Mode
  9. Console.WriteLine("正常运行");
  10. #endif
  11. }
  12.  
  13. static void DebugInvoke()
  14. {
  15. #if !Debug_Mode
  16. #error 这个方法只能在调试模式中使用
  17. #endif
  18. Console.WriteLine("现在进入调试模式...");
  19. }
  20. }

编译命令分别为

csc diaDemo.cs

csc /d:Debug_Mode diaDemo.cs

效果分别为

 

region 指令

这个指令我想用过C#的都应该熟悉,略去不表

 

总结

1、源文件中的任何 #define 和 #undef 指令都必须出现在源文件中的一个C#标识符前面,否则将出现编译时错误

2、不建议用#define 方式在源代码中定义预编译符号,建议采用编译器命令行参数的方式定义预编译符号

3、预处理符号定义是在编译时指定不是运行时指定

看一个运行时指定运行参数的例子  demo2.cs

  1. using System;
  2.  
  3. class App
  4. {
  5. static void Main(string[] args)
  6. {
  7. foreach(string arg in args)
  8. {
  9. Console.WriteLine(arg);
  10. }
  11. }
  12. }

编译命令 csc demo2.cs

运行效果

 

本文完

C# 预处理指令的更多相关文章

  1. 预处理指令#pragma

    #pragma介绍 #pragma是一个预处理指令,pragma的中文意思是『编译指示』.它不是Objective-C中独有的东西(貌似在C/C++中使用比较多),最开始的设计初衷是为了保证代码在不同 ...

  2. C/C++预处理指令#define,#ifdef,#ifndef,#endif…

    2016年12月29日更新: 今天查看以前文件的时候, 突然发现了#error 这个预处理指令.然后回想一下工作, 发现这个指令使用场景还是很多的.比如: 一个项目的模块儿之多,源文件之大,代码之多, ...

  3. Effective Objective-C 2.0 — 第四条:多用类型常量,少用#define预处理指令

    第四条:多用类型常量,少用#define预处理指令 使用#define 预处理的坏处:定义出来的常量没有类型信息,编译器只是会在编译前据此执行查找与替换操作.即使有人重新定义了常量值,编译器也不会产生 ...

  4. VC中预处理指令与宏定义详解

    刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个 ...

  5. C#中的预处理指令

    C#中的预处理指令 作为预处理中的一对:#region name ,#endregion可能是大家使用得最多的,我也常用它来进行代码分块,在一个比较长的cs文件中,这么做确实是一件可以让你使代码更清晰 ...

  6. C#学习笔记(十五):预处理指令

    C#和C/C++一样,也支持预处理指令,下面我们来看看C#中的预处理指令. #region 代码折叠功能,配合#endregion使用,如下: 点击后如下: 条件预处理 条件预处理可以根据给出的条件决 ...

  7. iOS预处理指令

    预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器.可见预处理过程先于编译器对源代码进行处理. 预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空 ...

  8. #pragma预处理指令讲解

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...

  9. C学习笔记之预处理指令

          一.什么是预处理指令            预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包括,条件编译. 预处理指令一般以 # 号开头,能够出如今文件的不论什么地方, ...

随机推荐

  1. .编写Java应用程序。首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。其次,再定义一个主类——TestClass,在主类 的main方法中创建Print类的对象,使用这个对象调用方法output ()来打印出大 小写英文字母表。

    package com.homework.zw; //类Print部分 public class Print1 { int x; void output() { if(x==1) { for(int ...

  2. mysql---where子查询、form子查询、exists子查询

    1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询. 2.子查询有什么好处? 子查询可以使用几个简单命令构造功能强大的复合命令. 那么,现在让我们一起来学习子查询. 3.where型的子 ...

  3. 【转】Netty那点事(二)Netty中的buffer

    [原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch2-buffer.md 上一篇文章我们概要介绍了Netty的原 ...

  4. asp.net中application,cookies,stateview,session的使用

    Cookie Cookie的用法也和ASP中差不多.比如我们建立一个名为aspcn,值为飞刀的cookie HttpCookie cookie = new HttpCookie["aspcn ...

  5. POJ 2003 Hire and Fire (Tree)

    题目:Hire and Fire 题目翻译成数据结构就是:建树,加结点,删除结点,打印结点.只有删除结点稍微复杂点,因为删除设计掉树的调整. 首先要考虑树怎么存储才能使解题更顺手. 1.我们要存储每个 ...

  6. 一、 Socket之UDP异步传输文件

    用SCOKET 发送文件是一个不太好处理的问题,网上的例子也都是很简单的,我准备写一个比较完善的例子,这个就算是开始吧,以后的都会在这个例子的基础上进行修改,准备实现多线程传输.断点传输和文件传输的完 ...

  7. Windows 8.1 Hyper-V安装的虚拟机

    一.安装Hyper-v Hyper-V内置于Windows 8中,用户无需格外的下载安装文件,只需要到Windows 8的程序管理中将其选中开启功能即可. 具体步骤:控制面板→程序→启用或关闭Wind ...

  8. tar备份系统

    一.概述 前几天我通过SSH正在调戏汤姆猫(tomcat)的时候,服务器上CentOS突然挂了.开机grub,使用光盘linux rescue修复提示找不到linux分区,然后想mount硬盘备份系统 ...

  9. iOS 中的 block 是如何持有对象的

    Block 是 Objective-C 中笔者最喜欢的特性,它为 Objective-C 这门语言提供了强大的函数式编程能力,而最近苹果推出的很多新的 API 都已经开始原生的支持 block 语法, ...

  10. 如何真正免费运营推广APP应用

    随着移动终端的迅速普及,各类APP如雨后春笋般涌现出来,但是真正的运营成功的产品却寥寥无几. 从瓜分渠道资源到抢占用户的过程中,很多同行都明显的感觉到,渠道平台所带来的量日益减少,但是刊例价格却一再攀 ...