前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面向对象(三十三)-预处理指令

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

作者头像
孙寅
发布2020-06-02 14:56:35
8970
发布2020-06-02 14:56:35
举报
文章被收录于专栏:宜达数字
  • 什么是预处理指令 预处理器指令指导编译器在实际编译开始之前对信息进行预处理。
    • 预处理指令注意点 所有的预处理器指令都是以 # 开始。且在一行上,只有空白字符可以出现在预处理器指令之前。预处理器指令不是语句,所以它们不以分号(;)结束。 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
杂注特定的参数。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档