C# 预处理指令
概念
预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
常见指令
1、#define和#undef
用法:
#define DEBUG 定义宏
#undef DEBUG 取消已定义的宏
#define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量,但是它没有具体的值,可以将它看为一个符号而已。#undef就是删除这个符号的定义。如果符号DEBUG没定义过,则#undef不起作用,否则#define不起作用。二者都必须放在源代码之前。二者的顺序看代码的顺序:
#define DEBUG
#undef DEBUG
这样的话,DEBUG是没有定义的,如果二者换个顺序,编译器就认为DEBUG被定义了
2、#if、#elif、#else、#endif
这个告诉编译器进行编译代码的流程控制。考虑下面代码:
#if DEBUG
Console.Write("debug");
#elif RELEASE
Console.Write("realse");
#else
Console.Write("other");
#endif
以上代码就是说如果定义了DEBUG则输出debug,定义了RELEASE,则输出realse,否则输出other。如果定义了DEBUG和REALSE会怎么样呢?各位可以自己试一下。
3、#region 和#endregion
这个两个用来组成代码块
4、#warning、#error(不咋用)
通过这两个指定可以告诉编译器,出一个警告还是错误信息。除了错误信息以后,编译将停止
参考下面的代码
#if DEBUG ------〉该DEBUG如果选中当前状态为DEBUG,则这个默认为#define
#warning “现在是Ddbug状态”
#elif RELEASE ------〉如果选中release状态的话,这个确没有默认,不知道我试验的对不对
#warning “现在是Realse状态”
#else
#error“并清楚什么状态”
#endif
5、#line (这个指定的使用不太明白,参考MSDN)(不咋用)
这个指令可以改jian变编译器在警告和错误信息中显示的文件名和行号信息,用#line default把行号恢复为默认的行号。
下面的示例说明如何报告与行号关联的两个警告。#line 200 指令迫使行号为 200(尽管默认值为 #7)。另一行 (#9) 作为默认 #line 指令 的结果跟在通常序列后。
// preprocessor_line.cs
public class MyClass2
{
public static void Main()
{
#line 200
int i; // CS0168 on line 200
#line default
char c; // CS0168 on line 9
}
}
示例 2
下面的示例说明调试器如何忽略代码中的隐藏行。运行此示例时,它将显示三行文本。但是,当设置如示例所示的断点并按 F10 键逐句通过代码时,您将看到调试器忽略了隐藏行。另请注意,即使在隐藏行上设置断点,调试器仍会忽略它。
// preprocessor_linehidden.cs
using System;
class MyClass
{
public static void Main()
{
Console.WriteLine("Normal line #1."); // Set a break point here.
#line hidden
Console.WriteLine("Hidden line.");
#line default
Console.WriteLine("Normal line #2.");
}
}
UNITY 中的系统宏
Property: | Function: |
---|---|
UNITY_EDITOR | Unity编辑器 |
UNITY_EDITOR_WIN | Windows 操作系统. |
UNITY_EDITOR_OSX | macos操作系统 |
UNITY_STANDALONE_OSX | 专门为macos(包括Universal, PPC,Intel architectures)平台的定义 |
UNITY_STANDALONE_WIN | 专门为windows平台的定义 |
UNITY_STANDALONE_LINUX | 专门为Linux平台的定义 |
UNITY_STANDALONE | 独立平台 (Mac OS X, Windows or Linux). |
UNITY_WII | WII 游戏机平台 |
UNITY_IOS | iOS系统平台 |
UNITY_IPHONE | iPhone |
UNITY_ANDROID | android系统平台 |
UNITY_PS4 | ps4平台 |
UNITY_SAMSUNGTV | 三星TV平台 |
UNITY_XBOXONE | Xbox One 平台 |
UNITY_TIZEN | Tizen 平台 |
UNITY_TVOS | Apple TV 平台 |
UNITY_WSA | #define directive for Universal Windows Platform. Additionally, NETFX_CORE is defined when compiling C# files against .NET Core and using .NET scripting backend. |
UNITY_WSA_10_0 | #define directive for Universal Windows Platform. Additionally WINDOWS_UWP is defined when compiling C# files against .NET Core. |
UNITY_WINRT | UNITY_WSA. |
UNITY_WINRT_10_0 | UNITY_WSA_10_0 |
UNITY_WEBGL | #define directive for WebGL. |
UNITY_FACEBOOK | faceBook平台(WebGL or Windows standalone). |
UNITY_ADS | 调用广告方法,版本 5.2 以后 |
UNITY_ANALYTICS | 调用unity分析服务,版本5.2以后 |
UNITY_ASSERTIONS | 控制指令的过程 |
Unity版本判定方式:UNITY_X,UNITY_X_Y,UNITY_X_Y_Z 例如:
UNITY_5 | unity5版本, 包含所有的5.x.y版本 |
UNITY_5_0 | Unity5.0版本,包含所有的5.0.x版本 |
UNITY_5_0_1 | Unity5.0.1版本 |
打包的时候,选择File > Build Settings然后显示平台选择界面.
代码实例C#:
// C#
using UnityEngine;
using System.Collections;
public class PlatformDefines : MonoBehaviour {
void Start () {
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#endif
#if UNITY_IOS
Debug.Log("Iphone");
#endif
#if UNITY_STANDALONE_OSX
Debug.Log("Stand Alone OSX");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("Stand Alone Windows");
#endif
}
}
可以使用#if #elif
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#elif UNITY_IOS
Debug.Log("Unity iPhone");
#else
Debug.Log("Any other platform");
#endif
可以自定义宏定义,打开Other Settings窗口,选择Player Settings > Scripting Define Symbols