CS4L19——预处理器指令

本章代码关键字

1
2
3
4
5
6
7
8
9
10
#define        // 定义一个符号
#undef // 取消定义符号
// 配合定义的符号进行条件编译
#if
#elif
#else
#endif

#warning // 向编译器发出警告
#error // 向编译器报错,使编译不通过

编译器

编译器是一种翻译程序,它用于将源语言程序翻译成目标语言程序

  • 源语言程序:某种程序设计语言写成的,比如 C#、C、C++、Java 等语言写的程序
  • 目标语言程序:二进制数标识的伪机器代码写的程序

编译器就会将我们编写的 .cs​ 源代码文件编译为 .exe​ 或者 .dll​ 等可执行程序

预处理器指令

预处理器指令 指导编译器 在实际编译开始之前对信息进行预处理
预处理器指令 都是以 #​ 开始,预处理器指令不是语句,所以他们不以分号 ;​ 结束
常用的折叠代码块 就是 预处理器指令

常见的预处理器指令

定义符号 #define

#define​:定义一个符号,类似于一个没有值的变量,必须写在写在脚本文件的最前面,一般配合 #if​ 指令使用,或者配合特性

1
2
3
4
5
// 定义符号
#define Unity4
#define Unity5
#define Unity2017
#define Unity2019

取消定义 #undef

取消 #define​ 定义的符号,让其失效,必须写在写在脚本文件的最前面,一般配合 #if​ 指令使用,或者配合特性

1
2
3
4
// 定义符号
#define Unity4
// 取消定义符号
#undef Unity4

条件编译 #if

#if​、#elif​、#else​、#endif​,它们和 if​ 语句规则一样,一般配合 #define​ 定义的符号使用

它们用于告诉编译器进行编译代码的流程控制,如果发现有 #define​ 这个符号
那么其中的包含的代码 就会被编译器编译,可以通过 逻辑或 和 逻辑与 来进行多种符号的组合判断

条件编译的意义是,对于一些不同的运行平台,例如 IOS,Android 等,由于平台的限制,可能我们需要在不同的平台上执行不同的代码,
这时就需要借助平台编译符号,如 Android​、IOS​ 等来判断,编译不同的代码,以确保不同平台编译的代码不同
有时不同版本的 Unity 编辑器也需要使用预定义好的符号,去判断当前的 Unity 编辑器版本应该编译执行什么样的代码

以下面的代码为例,如果发现 Unity5​ 这个符号被 #define​ 了,其中 #if​ 相关的代码就会被编译,运行程序被编译的代码才会得到执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define Unity5
#define Unity4
#undef Unity4

class Program
{
static void Main()
{
#if Unity4
Console.WriteLine("Unity4相关代码被编译了");
#elif Unity5
Console.WriteLine("Unity5相关代码被编译了");
#else
Console.WriteLine("Unity4和Unity5相关代码都没有被编译");
#endif
}
}

输出:

1
Unity5相关代码被编译了

如果让不取消 Unity4​ 这个符号的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define Unity4
#define Unity5

class Program
{
static void Main()
{
#if Unity4
Console.WriteLine("Unity4相关代码被编译了");
#elif Unity5
Console.WriteLine("Unity5相关代码被编译了");
#else
Console.WriteLine("Unity4和Unity5相关代码都没有被编译");
#endif
}
}

输出:

1
Unity4相关代码被编译了

警告或报错

  • #warning​ 会告诉编译器此处代码需要警告
  • #error​ 会告诉编译器此处代码有错误,需要报错,当此预处理器生效时编译不可通过

一般还是配合 #if​ 语句使用,用于提示当前编译条件下,编译出来的程序可能会出现问题

1
2
3
4
5
6
7
8
class Program
{
static void Main()
{
#warning 此版本不合法
#error 此版本编译不能跳过
}
}