- 什么是预处理指令
预处理器指令指导编译器在实际编译开始之前对信息进行预处理。
- 预处理指令注意点 所有的预处理器指令都是以 # 开始。且在一行上,只有空白字符可以出现在预处理器指令之前。预处理器指令不是语句,所以它们不以分号(;)结束。 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。
代码语言: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
预处理器指令创建符号常量。
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工具编写代码,将会看到代码呈现不同颜色。
#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
代码注释块
#region 操作
// 代码块写到两者中间即可
Console.WriteLine("操作");
#endregion
效果
代码语言:javascript复制#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
代码语言:javascript复制pragma-name
可识别杂注的名称。
pragma-arguments
杂注特定的参数。