FreeBASIC学习笔记——第09章 预编译

来源:互联网 发布:mysql应用 编辑:程序博客网 时间:2024/05/16 09:41

9.1 文件包含

        FreeBASIC文件包含有三个指令:#Include,句包含另一个源文件的内容;#IncLib,包含一个库文件;#libpath,将库搜索路径添加到链接器的搜索路径列表中。

        #Include在其指令出现的位置插入另一个文件的源代码。这具有从所包含的文件编译源代码的效果,就好像它是包含它的源文件的一部分。一旦编译器到达了include文件的末尾,原始源文件就会继续编译。这使得文件可以根据功能分成多个文件,在由多个模块组成的程序中具有声明的单个文件是有用的。您可以在include文件中包含文件,这样可以避免将原始文件包含在其中,只有在编译后才会产生结果。通常,include文件的扩展名为.bi,主要用于声明库的过程或函数或变量,但任何有效的源代码都可能存在于包含的文件中。

       Once说明符告诉编译器只包含该文件一次,即使它被源代码包含多次。元命令$Include是#Include的替代形式,主要是为了兼容QuickBASIC存在的。正常使用建议用#include。

        根据需要,编译器将自动转换路径分隔符('/'和'\'),以正确加载文件。文件名称可以是绝对路径或相对路径。对于相对路径,或根本没有路径,include文件按以下顺序进行搜索:1、相对于源文件的目录;2、相对于当前工作目录;3、相对于使用-i命令行选项指定的添加目;4、FreeBASIC安装的包含文件夹(FreeBASIC\inc),其中FreeBASIC是fbc可执行文件所在的文件夹)

语法:


例如:FireFly默认引用的文件


        #IncLib在链接过程中包含一个库,就像用户在命令行中指定了-l libname一样。FreeBASIC的库文件以.a为后缀,例如:包含一个libmystuff.a的库文件可以用语句#inclib "mystuff" 来实现。
        #libpath将库搜索路径添加到链接器的搜索路径列表中,就像在命令行中使用'-p'选项指定的一样。路径与调用fbc的工作目录相对,而不是相对于源文件的目录。如果路径不存在并且编译和链接将继续,则不会生成错误。例如搜索lib目录下的外部库则使用#libpath “lib”。
9.2 宏定义
        FreeBASIC的宏定义有两种:#Define和#Macro。#Define允许声明基于文本的预处理器宏。一旦编译器看到#Define定义的标识符,则用它body 替换该标识符。body 可以为空。替换是递归完成的,直到没有更多的标识符可以替换,编译器可以继续分析生成的代码。#UnDef用于取消定义先前使用#Define定义的标识符。
        Parameters 将define转换为类似函数的宏,允许将文本参数传递给宏。body 中的任何参数名称的出现将在扩展期间由给定的参数文本替换。
        注意:在类似函数的宏声明中,标识符(Identifier)之后必须是括号“(”,之间不能有任何空格,否则编译器会将其视为body 的一部分。
        如果在模块级别定义,定义在整个模块中是可见的。如果在具有范围(Sub,For..Next,While..Wend,Do..Loop,Scope..End Scope等)的复合语句中定义了标识符 ,则标识符 定义仅在该范围内可见。另一方面,命名空间对define的可见性没有任何影响。可以使用-pp编译器选项检查宏扩展的结果。#Define通常用于声明常量,Const语句则是一种更为安全的声明方法。
语法:


例如:


        #Macro其实就是#Define的多行形式,语法如下:


例如:


9.3 条件编译

        条件编译语句即是有条件的在编译时选择一定的语句参与编译,FreeBASIC的条件编译语句有#if…#elseif…#else…#endif(这里可以是一个整体,也可以单独分开,跟if..else语句的用法相同,只是一个用于编译时,一个用于运行时)defined (symbol_name ) 用来判断给定符号名称是否定义,如果符号已被定义,defined预处理函数将返回真(True)如果符号未知,则返回假(False)。此语句通常配合#if条件语句来判断。

语法:


例如:


        #IfDef和#IfnDef用来判断标识符(symbol)是否定义,必须用#EndIf来结束。通常我们用#IfnDef来判断头文件是否多次引用。

语法:#IfDef


例如:


语法:#ifnDef


例如: