面向对象(三十三)-预处理指令

2020-06-02 14:56:35 浏览数 (1)

  • 什么是预处理指令 预处理器指令指导编译器在实际编译开始之前对信息进行预处理。
    • 预处理指令注意点 所有的预处理器指令都是以 # 开始。且在一行上,只有空白字符可以出现在预处理器指令之前。预处理器指令不是语句,所以它们不以分号(;)结束。 C# 编译器没有一个单独的预处理器,但是,指令被处理时就像是有一个单独的预处理器一样。在 C# 中,预处理器指令用于在条件编译中起作用。与 C 和 C 不同的是,它们不是用来创建宏。一个预处理器指令必须是该行上的唯一指令。

    预处理指令

预处理指令

  • Unity中的预处理指令
代码语言:javascript复制
UNITY_EDITOR 编辑器调用。

UNITY_STANDALONE_OSX 专门为Mac OS(包括Universal,PPC和Intelarchitectures)平台的定义。

UNITY_DASHBOARD_WIDGET Mac OS Dashboard widget (Mac OS仪表板小部件)。

UNITY_STANDALONE_WIN Windows 操作系统。

UNITY_STANDALONE_LINUX Linux的独立的应用程序。

UNITY_STANDALONE 独立的平台(Mac,Windows或Linux)。

UNITY_WEBPLAYER 网页播放器(包括Windows和Mac Web播放器可执行文件)。

UNITY_WII Wii游戏机平台。

UNITY_IPHONE iPhone平台。

UNITY_ANDROID Android平台。

UNITY_PS3 PlayStation 3。

UNITY_XBOX360 Xbox 360。

UNITY_NACL 谷歌原生客户端(使用这个必须另外使用UNITY_WEBPLAYER)。

UNITY_FLASH Adobe Flash。
代码语言:javascript复制
Unity游戏开发过程中的平台选择
   // 选择编译平台
    private string[] arrBuildTarget = { "Windows", "Android", "iOS" };
    // 编译平台   BuildTarget 是系统类
#if UNITY_STANDALONE_WIN   // Windows
    private BuildTarget target = BuildTarget.StandaloneWindows;
    // 这里表示你选中arrBuildTarget 哪一项
    private int buildTargetIndex = 0;
#elif UNITY_ANDROID   // 安卓
      private BuildTarget target =BuildTarget.Android;
    // 这里表示你选中arrBuildTarget 哪一项
    private int buildTargetIndex =1;
#elif UNITY_IPHONE  // iPhone
      private BuildTarget target =  BuildTarget.iOS;
    // 这里表示你选中arrBuildTarget 哪一项
    private int buildTargetIndex =2;
#endif
  • #define 预处理器指令创建符号常量。
代码语言:javascript复制
define指令,可以把它看做成声明一个变量
define指令必须在代码文件中的第一句。
没有分号作为结束标记。
单独使用是没有任何意义的,但是和#if #elif #else #endif一起使用就截然不同了。
代码语言:javascript复制
#define MyCount
#define UNITY5_6
using System;

namespace 预处理指令
{
    class Program
    {
        static void Main(string[] args)
        {
#if (MyCount && UNITY5_6)
            Console.WriteLine("MyCount is defined");
#else
            Console.WriteLine("MyCount is not defined");
#endif
            Console.WriteLine("123");
            Console.ReadKey();
        }
    }
}
  • #if #elif #else #endif指令条件指令 可以使用 #if 指令来创建一个条件指令。条件指令用于测试符号是否为真。如果为真,编译器会执行 #if 和下一个指令之间的代码。 这些指令就好比程序中的 if else 流程控制语句,只不过if else是在程序运行期间进行流程控制,而预处理指令将在程序编译期间就已经开始了,如用VS工具编写代码,将会看到代码呈现不同颜色。
代码语言:javascript复制
#if symbol [operator symbol]...
代码语言:javascript复制
#define DEBUG
#define A
#define B
#define C
using System;

namespace 预处理指令
{
    class Program
    {
        static void Main(string[] args)
        {
#if (A)
            Console.WriteLine("A");
#elif (B)
            Console.WriteLine("B");
#endif
            Console.ReadKey();
        }
    }
}

关于全局预处理指令的设置

预处理指令

全局设置

  • #region #endRegion代码注释块
代码语言:javascript复制
            #region 操作
            // 代码块写到两者中间即可
            Console.WriteLine("操作");
            #endregion

效果

代码语言:javascript复制
#error "此处预估会有错误"
            Console.WriteLine("这里会抛出错误");
#warning "此处预估会有警告"
            Console.WriteLine("这里会抛出警告");

可以在后面写一些错误提示

  • #warning #error警告与错误注释块
代码语言:javascript复制
#error
            Console.WriteLine("这里编译前会抛出错误,可以将开发中一些不确定的代码块写一下注释");
#warning
            Console.WriteLine("这里编译前会抛出警告,可以将开发中一些不确定的代码块写一下注释");
  • #line #line 使您可以修改编译器的行号以及(可选)错误和警告的文件名输出

#line 指令可能由生成过程中的自动中间步骤使用。例如,如果行从原始的源代码文件中移除,但是您仍希望编译器基于文件中的原始行号生成输出,则可以移除行,然后用 #line 模拟原始行号。 #line hidden 指令对调试器隐藏若干连续的行,这样当开发人员在逐句通过代码时,将会跳过 #line hidden 和下一个 #line 指令(假定它不是另一个 #line hidden 指令)之间的所有行。此选项也可用来使 ASP.NET 能够区分用户定义的代码和计算机生成的代码。尽管 ASP.NET 是此功能的主要使用者,但很可能将有更多的源生成器使用它。 #line hidden 指令不会影响错误报告中的文件名或行号。即,如果在隐藏块中遇到错误,编译器将报告当前文件名和错误的行号。 #line filename 指令指定您希望出现在编译器输出中的文件名。默认情况下,使用源代码文件的实际名称。文件名必须括在双引号 ("") 中。 源代码文件可以具有 #line 指令的任何编号。

代码语言:javascript复制
using System;
class MainClass 
{
    static void Main() 
    {
        Console.WriteLine("Normal line #1."); // Set break point here.
#line hidden
        Console.WriteLine("Hidden line.");
#line default
        Console.WriteLine("Normal line #2.");
    }
}
  • #pragma用于给编辑器提供特殊的指令,说明如何编译包含杂注的文件 #pragma warning 可以启用或禁用特定警告。 以逗号分隔的警告编号的列表。 “CS”前缀是可选的。 未指定警告编号时,disable 会禁用所有警告,restore 会启用所有警告
代码语言:javascript复制
#pragma warning disable warning-list  
#pragma warning restore warning-list  
代码语言:javascript复制
pragma-name
可识别杂注的名称。

pragma-arguments
杂注特定的参数。

0 人点赞