为什么YDWE的JASS库中有很多“#ifndef 库名”,作用是什么?

在解释这个功能之前要先知道YDWE中4个与之相关的宏命令的功能。

与导入函数库相关的4个宏命令

#require

这个命令的功能是手动导入一个外部的.j文件的代码到当前正在开发的地图中,实现同一份jass代码在不同地图里的共用。

#define

YDWE使用#define来定义一个用于编译时的变量,你可以为这个量赋值,也可以不设定。
如下均为正常使用的示例:

#define SomeLibraryIncluded
#define SomeLibraryName NameOfYourLibrary

#ifndef

ifndef是英文“if not defined”的简写,用于判定某个宏变量名字是否已经定义过了。
#ifndef宏命令通常是和#endif成对出现的,在编译过程中起条件分支的作用。

#endif

标志一个条件块分支的结束,类似JASS中的if-else-else if-endif结构。

为什么要使用“#ifndef 库名”

由于在实际的中、大型地图开发过程中,难免可能会出现作者使用了别人制作的拓展函数库,或者自己使用了多个函数库的情况。
在这种情况下,位于 YDWE根目录/jass 文件夹下的.j文件,有可能会被JASS开发者多次使用#require来加入到地图中。而在JASS代码中,同时存在相同名字的函数库、函数、变量名等等,都是错误的语法。
“#ifndef 库名”就是为了用于让YDWE的JASS编译器理解:“某个函数库已经被导入过了,不要再导入第二遍”,从而避免某个函数库被重复导入。

让我们使用中文来将一段实际的代码逻辑阐述一遍:

// 判断 宏变量“演示函数库已经被导入了” 是否已经定义了
#ifndef SampleLibraryIncluded
// 如果没有定义,则定义一次
#define SampleLibraryIncluded

// 下方是将被导入的实际代码
library SampleLibrary {
  function onInit() {
    BJDebugMsg("Hello World")
  }
}
// 上方是将被导入的实际代码

// 结束判断
#endif