来篇普及帖子吧——Lua预处理科普

皇家骑士 发表于 2018-12-3 10:45:54 | 显示全部楼层
@a4454962 发表于 2016-12-26 12:37:11

预处理 是指预先处理 指yd在编译地图时 预先处理的内容
从理论上来说 在地图保存前的所有操作都是对地图预处理
yd的是兼容多种插件的集合体 在预处理上有着先后执行的顺序
最先处理的是
插件wave
     wave是c/c++所采用的预处理插件 主要功能是
     引用代码 : #include
     宏定义     :  #define
     编译分支 :  #if 之类的预编译操作
紧接着处理的便是yd嵌入的lua预处理语法
  lua预处理提供2个嵌套功能
<? ?>  跟<?= ?>
这2个语法的作用是
<? ?> 是在中间写lua脚本语言 比如
<? s='hello world' ?>
执行之后s就是具有值的变量
之后使用
<?=s?>
将lua里的值返回在当前的jass脚本里
也就是<?=s?>会被替换成 hello world
这里就是lua预处理的语法

在lua预处理之后
如果有开启cj编译器 则会编译cj的语法
cj编译器提供的宏跟wave的宏 略有冲突
所以需要关注下细节
  wave :
         #include "文件.j"  //这个引用文件的目录是在yd目录下的logs文件夹里
        #define a 10  //将a替换成10 中间用空格隔开
  而cj的话
        cj :
         include "文件.j" //cj的引入文件 不加# 加了会被当成wave的操作 并且目录是在 yd里的cj目录里的libs文件夹里 目录不同
         define a=10  //cj的宏定义 不加# 防止被wave错认 并且语法上 是用= 号来 设置宏 而wave是用空格 语法不同 语言谨记
   cj的#if 如果跟 wave同时使用的话 会被错认成wave 然后cj的宏由于wave不认识 而导致功能无效
这里用法要稍微借助lua来做中介 防止被错认
define a=1
<?='#'?>if a==1
BJDebugMsg("hello world")
<?='#'?>endif

  cj编译后 则会编译
zinc / vj

zinc跟vj是同个编译器
编译完zinc 后就会编译vj

所以编译顺序是
wave-> lua -> cj > zinc/vj ->jass
这些有什么用呢
关键在于利用lua 控制他随后编译的内容
具体的下次再讲了

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

相关版块

相关标签

快速回复 返回顶部 返回列表