NASM源代码分析之预处理(3)
struct Include
{ Include *next;
FILE *fp;
Cond *conds;
Line *expansion;
char *fname;
int lineno, lineinc;
MMacro *mstk; /* stack of active macros/reps */
};
结构Include指代一个被包含的文件,比如在程序开头加入“ %include stdio.h”,则该Include结构即指向stdio.h这个文件,以下解释以这行代码为实例。
结构元素定义:
Include *next : Include 链表指针。
FILE *fp : 容易理解,指向该文件的指针。
Cond *conds: 见下面的Cond结构
Line *expansion: 在包含文件中添加额外行,例如在编译命令中通过-D预定义宏,则系统将该定义加入到包含文件中,具体代码大家可参见preproc.c中的Readline函数,开头的处理标准宏和预定义宏就用到了这个属性。
char *fname: 文件名,在此例中,*fname = “stdio.h”
int lineno: 在预定义输出文件中,该包含文件出现的开头行数。
int lineinc: 一般设为1,如果出现代码为:“%line nnn[+mmm] [filename]”时,则lineinc=mmm.
MMacro *mstk: 用于macros/reps,将到MMacro时再细谈。
struct Cond
{ Cond *next;
int state; // 条件状态,内容如下
};
Cond表示一个判断条件,可用于判断文件包含中的判断问题,例如:
%include “stdio.h”
包含在模块:
%ifdef ABC
%include “stdio.h”
.......
%endif
如果,ABC未被定义,则代表%include “stdio.h”的Include结构的cons项就等于
COND_IF_FALSE。
int state的值包括:
enum {
COND_IF_TRUE, COND_IF_FALSE,
COND_ELSE_TRUE, COND_ELSE_FALSE,
COND_NEVER
};
大家可能光看就可以明白它的意思了。
在代码中:
%if
... (1)
%else
... (2)
%endif
COND_IF_TRUE和COND_IF_FALSE用于在(1)中,
COND_ELSE_TRUE和COND_ELSE_FALSE用于(2)中。