20.预处理器指令

20.预处理器指令


20.1 知识点

什么是编译器

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

源语言程序是指某种程序设计语言写成的,比如C#、C、C++、Java等语言写的程序。

目标语言程序是指用二进制数表示的伪机器代码写的程序。

什么是预处理器指令

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

常见的预处理器指令

脚本文件最前面

定义符号和取消定义符号

//#define:定义一个符号,类似一个没有值的变量
#define Unity4
#define Unity5
#define Unity2017
#define Unity2019
#define IOS
#define Android
#define PC
//#undef:取消define定义的符号,让其失效
#undef Unity4

主函数内

定义符号和取消定义符号

两者都是写在脚本文件最前面,一般配合 if 指令使用或配合特性。

if语句指令
  //#if
  //#elif
  //#else
  //#endif
  //和if语句规则一样,一般配合#define定义的符号使用
  //用于告诉编译器进行编译代码的流程控制
  //有助于在实际开发中判断unity版本和平台等
  //注意:一定要有个#endif和#if配对

  //如果发现有Unity4这个符号 那么其中包含的代码 就会被编译器翻译
  //可以通过 逻辑或|| 和 逻辑与&& 进行多种符号的组合判断
  #if Unity4
  Console.WriteLine("版本为Unity4");
  //这里不会被编译 因为在脚本文件最前面定义了Unity4这个符号 又取消了这个符号 谁找不到了
  #elif Unity2017 && IOS
  Console.WriteLine("版本为Unity2017且为IOS平台");
  #else
  Console.WriteLine("其它版本");
  #endif

警告和报错指令

告诉编译器是报警告还是报错,一般还是配合 if 使用。

#if Unity4
Console.WriteLine("版本为Unity4");
//这里不会被编译 因为在脚本文件最前面定义了Unity4这个符号 又取消了这个符号 谁找不到了
#elif Unity2017 && IOS
Console.WriteLine("版本为Unity2017且为IOS平台");
#warning 这个版本 不合法
//会有警告 但是编译可以成功 可以运行
//#error 这个版本 不准执行
//会报错 编译都不能成功 不能运行
#else
Console.WriteLine("其它版本");
#endif

总结

  • 预处理器指令可以让代码还没有编译之前就可以进行一些预处理判断。
  • 在Unity中会用来进行一些平台或者版本的判断,决定不同的版本或者不同的平台使用不同的代码逻辑。

20.2 知识点代码

//脚本文件最前面

#region 知识点三 常见的预处理器指令

//1.定义符号和取消定义符号
//#define:定义一个符号,类似一个没有值的变量
#define Unity4
#define Unity5
#define Unity2017
#define Unity2019
#define IOS
#define Android
#define PC
//#undef:取消define定义的符号,让其失效
#undef Unity4

#endregion

using System;

namespace Lesson19_预处理器指令
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("预处理器指令");

            #region 知识点一 什么是编译器
            //编译器是一种翻译程序
            //它用于将源语言程序翻译为目标语言程序

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

            #region 知识点二 什么是预处理器指令
            //预处理器指令 指导编译器 在实际编译开始之前对信息进行预处理
            //预处理器指令 都是以#开始
            //预处理器指令不是语句,所以它们不以分号;结束
            //目前我们经常用到的 折叠代码块 #region #endregion 就是预处理器指令
            #endregion

            //主函数内

            #region 知识点三 常见的预处理器指令

            //1.定义符号和取消定义符号
            //#define:定义一个符号,类似一个没有值的变量
            //#undef:取消define定义的符号,让其失效
            //两者都是写在脚本文件最前面
            //一般配合 if指令使用 或配合特性

            //2.if语句指令
            //#if
            //#elif
            //#else
            //#endif
            //和if语句规则一样,一般配合#define定义的符号使用
            //用于告诉编译器进行编译代码的流程控制
            //有助于在实际开发中判断unity版本和平台等
            //注意:一定要有个#endif和#if配对

            //如果发现有Unity4这个符号 那么其中包含的代码 就会被编译器翻译
            //可以通过 逻辑或|| 和 逻辑与&& 进行多种符号的组合判断
#if Unity4
            Console.WriteLine("版本为Unity4");
            //这里不会被编译 因为在脚本文件最前面定义了Unity4这个符号 又取消了这个符号 谁找不到了
#elif Unity2017 && IOS
            Console.WriteLine("版本为Unity2017且为IOS平台");
#else
            Console.WriteLine("其它版本");
#endif

            //3.警告和报错指令
            //#warning
            //#error
            //告诉编译器
            //是报警告还是报错
            //一般还是配合if使用

#if Unity4
            Console.WriteLine("版本为Unity4");
            //这里不会被编译 因为在脚本文件最前面定义了Unity4这个符号 又取消了这个符号 谁找不到了
#elif Unity2017 && IOS
            Console.WriteLine("版本为Unity2017且为IOS平台");
#warning 这个版本 不合法
            //会有警告 但是编译可以成功 可以运行
            //#error 这个版本 不准执行
            //会报错 编译都不能成功 不能运行
#else
            Console.WriteLine("其它版本");
#endif

            #endregion
        }
    }

    //总结
    //预处理器指令
    //可以让代码还没有编译之前就可以进行一些预处理判断
    //在Unity中会用来进行一些平台或者版本的判断
    //决定不同的版本或者不同的平台使用不同的代码逻辑
}

20.3 练习题

请说出至少4种预处理器指令

  • #define: 定义一个符号(没有值的变量)
  • #undef: 取消定义一个符号
  • #if, #elif, #else, #endif: 条件编译指令
  • #warning: 发出警告
  • #error: 发出错误

请使用预处理器指令实现,写一个函数计算两个数,当是Unity5版本时算加法,当是Unity2017版本时算乘法,当时Unity2020版本时算减法,都不是返回0

脚本文件最前面

// 假设是Unity2020版本
#define Unity2020

class语句块内 主函数外

// 计算函数
static int Calc(int a, int b)
{
    #if Unity5
    return a + b;
    #elif Unity2017
    return a * b;
    #elif Unity2020
    return a - b;
    #else
    return 0;
    #endif
}

主函数内

Console.WriteLine(Calc(1, 2)); // 输出:-1

20.4 练习题代码


//脚本文件最前面

#region 练习题二

//假设是Unity2020版本
#define Unity2020

#endregion

using System;

namespace Lesson19_练习题
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("预处理器指令练习题");

            #region 练习题一
            //请说出至少4种预处理器指令

            //#define 定义一个符号 (没有值的变量)
            //#undef 取消定义一个符号

            //#if
            //#elif
            //#else
            //#endif

            //#warning
            //#error
            #endregion

            //主函数内

            #region 练习题二
            //请使用预处理器指令实现
            //写一个函数计算两个数
            //当是Unity5版本时算加法
            //当是Unity2017版本时算乘法
            //当时Unity2020版本时算减法
            //都不是返回0

            Console.WriteLine(Calc(1, 2));//-1
            #endregion
        }

        //class语句块内 主函数外

        #region 练习题二

        //计算函数
        static int Calc(int a, int b)
        {
#if Unity5
            return a + b;
#elif Unity2017
            return a * b;
#elif Unity2020
            return a - b;
#else
            return 0;
#endif
        }

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏