📄 preprocessor.html
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=bg2312">
<META NAME="Author" CONTENT="Spock">
<META NAME="GENERATOR" CONTENT="Mozilla/4.01 [en] (Win95; I) [Netscape]">
<TITLE>MudOS v21c2 参考文件 - concepts - preprocessor</TITLE>
</HEAD>
<BODY TEXT="#CCFFFF" BGCOLOR="#000000" LINK="#33FF33" VLINK="#FF0000" ALINK="#33CCFF" BACKGROUND="../../image/ff/fftitleback.jpg" NOSAVE>
<CENTER>
<H1>
<FONT COLOR="#FF99FF">预处理区 (preprocessor)</FONT></H1></CENTER>
<CENTER>
<HR WIDTH="100%"></CENTER>
<CENTER><FONT COLOR="#FFFFCC">LPC 预处理区 (preprocessor) 手册</FONT></CENTER>
<CENTER><FONT COLOR="#FFFFCC">(93.07.17 更新)</FONT></CENTER>
<HR WIDTH="100%">
<P>对 LPC 编译器 (compiler) 而言, 预处理区是源代码的最前端, 它提供以下便利的特性:
<UL>
<LI>
共享的定义和源代码 (#include)</LI>
<LI>
宏 (macros) (#define, #undef)</LI>
<LI>
编译条件 (#if, #ifdef, #ifndef, #else, #elif, #endif)</LI>
<LI>
除错 (#echo)</LI>
<LI>
使用特定的编译器功能 (#pragma)</LI>
<LI>
快速的文章格式 (@, @@)</LI>
</UL>
前三个与 C 相同. 如果您熟悉 C 语言, 大概只会浏览此份文件的最后几段文字.
<P>说明:
<UL>前面以 # 开头的命令 (像是 #include), 其 # 符号必须摆在每行的第一个字,
前面不可留有空白.</UL>
<HR WIDTH="100%">
<CENTER><FONT COLOR="#FFFFCC">共享的定义和源代码</FONT></CENTER>
<HR WIDTH="100%">#include 提供此功能.
<UL>语法 1 : <FONT COLOR="#FFCC99">#include <file.h></FONT></UL>
<UL>语法 2 : <FONT COLOR="#FFCC99">#include "file.h"</FONT></UL>
说明:
<UL>语法 1 的形式, 会在系统的标准引用 (include) 目录中, 寻找 file.h.
(在 TMI 中是 /include)</UL>
<UL>语法 2 的形式, 会在程序文件所在的同一个目录中, 寻找欲引用的 file.h</UL>
#include 语句是以文字命令的方式, 在一个文件中引用另一个文件. 在一个文件中放上像
#include "file.h" 的语句, 就如同 file.h 的内容直接放入 #include 所在的位置.
在每次物件重新编译时, 物件所引用的文件也会重新编译一次. 如果引用的文件里面有变量或函数与此文件中的相同,
编译此文件时会产生双重命名的错误 (duplicate-name error) (如果您把 file.h
的内容放在 #include 的位置, 一样会产生错误).
<P>
<HR WIDTH="100%">
<CENTER><FONT COLOR="#FFFFCC">宏</FONT></CENTER>
<HR WIDTH="100%">
<BR>宏定义将后面源代码中的一些字换成定义的内容. 目的在于隐藏程序内部的细节、减少打字的数量、便于更改常数
(constant).
<UL>语法 1 : <FONT COLOR="#FFCC99">#define identifier token_sequence</FONT></UL>
<UL>语法 2 : <FONT COLOR="#FFCC99">#define identifier(id_list) token_sequence</FONT></UL>
说明:
<UL>惯例上, 源代码中的 identifier 使用大写英文字母以强调它们所出现的位置,
并且在源代码开端或是所引用的表头档 (header file) 中定义其内容.</UL>
<UL>第二种语法让 id_list 列出的 identifier 能代换成 token_sequence.</UL>
范例:
<UL>/* 造出一个有 40 个元素的整数数组, 并将所有元素的值初始化为其编号的两倍.
即 stack[0] = 0, stack[1] = 2, stack[2] = 4 ....以此类推. */
<P><FONT COLOR="#99FF99">#define STACKSIZE 40</FONT>
<BR><FONT COLOR="#99FF99">#define INITCELL(x) 2*x</FONT>
<P><FONT COLOR="#99FF99">int *stack;</FONT>
<P><FONT COLOR="#99FF99">create() {</FONT>
<UL><FONT COLOR="#99FF99">int i;</FONT>
<P><FONT COLOR="#99FF99">stack = allocate(STACKSIZE);</FONT>
<P><FONT COLOR="#99FF99">for (i = 0; i < STACKSIZE; i++)</FONT>
<UL><FONT COLOR="#99FF99">stack[i] = INITCELL(i);</FONT></UL>
</UL>
<FONT COLOR="#99FF99">}</FONT></UL>
最后, 有时会用到清除定义 (undefine) [让编译器 (compiler) 别理会此定义].
这样就用到下面的命令.
<UL>语法 : <FONT COLOR="#FFCC99">#undef identifier</FONT></UL>
说明:
<UL>#undef 可以清除一个根本不存在的 identifier.</UL>
<CENTER>
<HR WIDTH="100%"><FONT COLOR="#FFFFCC">编译条件</FONT></CENTER>
<HR WIDTH="100%">这些命令可以让您的程序更具有可塑性 (flexibility). 利用
identifier 定义与否, 可以为不同的目的而变化源代码. 用途像是挑选系统管理员连线、支援多个驱动程序
(或不同版本的驱动程序).
<P>语法 :
<UL><FONT COLOR="#FFCC99">#ifdef <identifier></FONT>
<BR><FONT COLOR="#FFCC99">#ifndef <identifier></FONT>
<BR><FONT COLOR="#FFCC99">#if <expression></FONT>
<BR><FONT COLOR="#FFCC99">#elif <expression></FONT>
<BR><FONT COLOR="#FFCC99">#else</FONT>
<BR><FONT COLOR="#FFCC99">#endif</FONT></UL>
说明:
<UL> <identifier> 是一个已经定义 (或应该定义) 的 identifier. 它应于您的程序或是已经引用的文件事先定义,
不然就是驱动程序已定义的符号 (symbol).</UL>
<UL> <expression> 是一个常数运算式 (constant expression), 计算布林
(boolean) 逻辑条件. 运算式中, 可以在合于语法的情形下, 使用下面的组合:</UL>
<UL>
<UL>运算符: <FONT COLOR="#FFCC99">||, &&, >>, <<, +, -, *,
/, %, &, |, ^, !, ~, ==, !=, <, >, <=, >=, ?:</FONT></UL>
</UL>
<UL>
<UL>用来分组的小括号:<FONT COLOR="#FFCC99"> (, )</FONT>
<BR>调用形式: <FONT COLOR="#FFCC99">defined(identifier)</FONT>
<BR>以及 <FONT COLOR="#FFCC99">identifiers</FONT></UL>
</UL>
<UL><FONT COLOR="#99FF99">#ifdef identifier</FONT></UL>
<UL>可以视为这行的缩写:</UL>
<UL>
<UL><FONT COLOR="#99FF99">#if defined(identifier)</FONT></UL>
<UL><FONT COLOR="#99FF99">#ifndef identifier</FONT></UL>
</UL>
<UL>可以视为这行的缩写:</UL>
<UL>
<UL><FONT COLOR="#99FF99">#if !defined(identifier)</FONT></UL>
</UL>
<UL>
<UL><FONT COLOR="#99FF99">#elif expression</FONT></UL>
</UL>
<UL>可以视为这些的缩写:</UL>
<UL>
<UL><FONT COLOR="#99FF99">#else</FONT>
<BR><FONT COLOR="#99FF99"># if expression</FONT>
<BR><FONT COLOR="#99FF99"># endif</FONT></UL>
</UL>
范例 1:
<UL>/* 使用 #if 0 可以让你在一段源代码中加上注解 (comment). 这样做的其中一个理由是把旧的源代码保留在原位,
防止新的程序失败. */</UL>
<UL><FONT COLOR="#99FF99">#if 0</FONT></UL>
<UL>/* 在此, 常数运算式算出 (或说本来就是) 0 , 所以此段源代码不予编译.
*/</UL>
<UL>
<UL><FONT COLOR="#99FF99">write(user_name + " 有 " + total_coins + " 元.\n");</FONT></UL>
</UL>
<UL><FONT COLOR="#99FF99">#else</FONT></UL>
<UL>/* 这是另外的情形 (if 算出零值, else 就是非零值), 所以会编译此段程序.
*/</UL>
<UL>
<UL><FONT COLOR="#99FF99">printf("%s 有 %d 元\n", user_name, total_coins);</FONT></UL>
</UL>
<UL><FONT COLOR="#99FF99">#endif</FONT></UL>
范例 2:
<UL>// 这个范例由 TMI 的 /adm/simul_efun/system.c 改写而来.</UL>
<UL><FONT COLOR="#99FF99">#ifdef __VERSION</FONT>
<UL><FONT COLOR="#99FF99">string version() { return __VERSION__; }</FONT></UL>
<FONT COLOR="#99FF99">#elif defined(MUDOS_VERSION)</FONT>
<UL><FONT COLOR="#99FF99">string version() { return MUDOS_VERSION; }</FONT></UL>
<FONT COLOR="#99FF99">#else</FONT>
<BR><FONT COLOR="#99FF99"># if defined(VERSION)</FONT>
<UL><FONT COLOR="#99FF99">string version() { return VERSION; }</FONT></UL>
<FONT COLOR="#99FF99"># else</FONT>
<UL><FONT COLOR="#99FF99">string version() { return -1; }</FONT></UL>
<FONT COLOR="#99FF99"># endif</FONT>
<BR><FONT COLOR="#99FF99">#endif</FONT></UL>
<CENTER>
<HR WIDTH="100%"><FONT COLOR="#FFFFCC">除错</FONT></CENTER>
<HR WIDTH="100%">
<BR>#echo 命令让您向驱动程序的 stderr (STanDard ERRor, 标准错误处理) 印出消息.
这项功能在诊断和除错时非常有用.
<UL>语法:
<UL><FONT COLOR="#FFCC99">#echo This is a message</FONT></UL>
</UL>
说明:
<UL>#echo 这行就是消息的内容, 并逐字印出. 消息前后不用加上 ".</UL>
<CENTER>
<HR WIDTH="100%"><FONT COLOR="#FFFFCC">特定的编辑器功能</FONT></CENTER>
<HR WIDTH="100%">
<BR>这项是驱动程序内建的功能.
<UL>语法:
<UL><FONT COLOR="#FFCC99">#pragma keyword</FONT></UL>
</UL>
目前可用的 keyword 列在下面:
<BR>
<UL>
<LI>
<FONT COLOR="#99FF99">strict_types</FONT></LI>
<LI>
<FONT COLOR="#99FF99">save_binary</FONT></LI>
<LI>
<FONT COLOR="#99FF99">save_types</FONT></LI>
<LI>
<FONT COLOR="#99FF99">warnings</FONT></LI>
<LI>
<FONT COLOR="#99FF99">optimize</FONT></LI>
<LI>
<FONT COLOR="#99FF99">error_context</FONT></LI>
</UL>
使用 #pragma no_keyword 可以关闭指定的功能.
<P>说明:
<UL>
<UL>
<LI>
'strict_types' 告诉编译器调用 call_other() 的函数, 其返回值不可忽略.</LI>
<LI>
'save_binary' 告诉编译器要储存此物件的二进位 (binary) 档. 在重新启动或关闭游戏之后,
载入物件的时间会变快, 因为物件已经储存为二进位档, 不必重新编译.</LI>
<LI>
'save_types' 目前停用</LI>
<LI>
'warnings' 在您的 LPC 源代码开启一些警告措施. 这些警告不见得会依照您预料中的结果反应.</LI>
<LI>
'optimize' 用一点时间改进编译过的源代码效率.</LI>
<LI>
'error_context' 于错误消息中使用更多的文字指示哪一行发生错误.</LI>
</UL>
</UL>
<HR WIDTH="100%">
<CENTER><FONT COLOR="#FFFFCC">快速文章格式</FONT></CENTER>
<HR WIDTH="100%">
<BR>这项功能便于求助消息、房间语句等长篇内容使用文章格式.
<UL>语法 1 :</UL>
<UL>
<UL><FONT COLOR="#FFCC99">@marker</FONT>
<BR><FONT COLOR="#FFCC99"><... text block ...></FONT>
<BR><FONT COLOR="#FFCC99">marker</FONT></UL>
</UL>
<UL>语法 2 :</UL>
<UL>
<UL><FONT COLOR="#FFCC99">@@marker</FONT>
<BR><FONT COLOR="#FFCC99"><... text block ...></FONT>
<BR><FONT COLOR="#FFCC99">marker</FONT></UL>
</UL>
Notes:
<UL>@ - 产生一个适于 write() 的字符串.</UL>
<UL>@@ - 产生一个字符串数组, 适于分页文章 (body pager).</UL>
在结束标记 (end marker) 之前, 使用 @marker 或 @@marker. 两者之间是您想对使用者显示的文章.
文章以 marker 作为结束, 不必加 @ 或 @@. 使用 @, 文章就如同一个字符串, 换行处加上
\n. 使用 @@, 文章就如同一个字符串数组, 而每一行分别是一个字符串.
<P>范例 1 :
<UL><FONT COLOR="#99FF99">int help() {</FONT>
<UL><FONT COLOR="#99FF99">write( @ENDHELP</FONT></UL>
<FONT COLOR="#99FF99">这是求助文章。</FONT>
<BR><FONT COLOR="#99FF99">It's hopelessly inadequate.</FONT>
<BR><FONT COLOR="#99FF99">ENDHELP</FONT>
<UL><FONT COLOR="#99FF99">);</FONT>
<BR><FONT COLOR="#99FF99">return 1;</FONT></UL>
<FONT COLOR="#99FF99">}</FONT></UL>
<UL>与此相同:</UL>
<UL><FONT COLOR="#99FF99">int help() {</FONT>
<UL><FONT COLOR="#99FF99">write( "这是求助文章。\nIt's hopelessly inadequate.\n"
);</FONT>
<BR><FONT COLOR="#99FF99">return 1;</FONT></UL>
<FONT COLOR="#99FF99">}</FONT></UL>
范例 2 :
<UL><FONT COLOR="#99FF99">int help() {</FONT>
<UL><FONT COLOR="#99FF99">this_player()->more( @@ENDHELP</FONT></UL>
<FONT COLOR="#99FF99">这是求助文章。</FONT>
<BR><FONT COLOR="#99FF99">It's hopelessly inadequate.</FONT>
<BR><FONT COLOR="#99FF99">ENDHELP</FONT>
<UL><FONT COLOR="#99FF99">, 1);</FONT>
<BR><FONT COLOR="#99FF99">return 1;</FONT></UL>
<FONT COLOR="#99FF99">}</FONT></UL>
<UL>与底下相同:</UL>
<UL><FONT COLOR="#99FF99">int help() {</FONT>
<UL><FONT COLOR="#99FF99">this_player()->more( ({ "这是求助文章。", "It's
hopelessly inadequate." }), 1);</FONT>
<BR><FONT COLOR="#99FF99">return 1;</FONT></UL>
<FONT COLOR="#99FF99">}</FONT></UL>
<HR WIDTH="100%">
<CENTER><FONT COLOR="#FFFFCC">翻译: Spock @ FF 97.Aug.9.</FONT></CENTER>
<CENTER>
<HR WIDTH="100%"></CENTER>
<CENTER><A HREF="../concepts_index.html">回到上一页</A></CENTER>
<CENTER>
<HR WIDTH="100%"></CENTER>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -