美文网首页
面向对象(三十三)-预处理指令

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

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


        预处理指令
    预处理指令
    • Unity中的预处理指令
    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。
    
    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 预处理器指令创建符号常量。
    define指令,可以把它看做成声明一个变量
    define指令必须在代码文件中的第一句。
    没有分号作为结束标记。
    单独使用是没有任何意义的,但是和#if #elif #else #endif一起使用就截然不同了。
    
    #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工具编写代码,将会看到代码呈现不同颜色。
    #if symbol [operator symbol]...
    
    #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代码注释块
                #region 操作
                // 代码块写到两者中间即可
                Console.WriteLine("操作");
                #endregion
    
    效果
    #error "此处预估会有错误"
                Console.WriteLine("这里会抛出错误");
    #warning "此处预估会有警告"
                Console.WriteLine("这里会抛出警告");
    
    可以在后面写一些错误提示
    • #warning #error警告与错误注释块
    #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 指令的任何编号。

    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 会启用所有警告
    #pragma warning disable warning-list  
    #pragma warning restore warning-list  
    
    pragma-name
    可识别杂注的名称。
    
    pragma-arguments
    杂注特定的参数。
    

    相关文章

      网友评论

          本文标题:面向对象(三十三)-预处理指令

          本文链接:https://www.haomeiwen.com/subject/kiuxkftx.html