NASM源代码分析之预处理(3)

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_TRUECOND_IF_FALSE用于在(1)中,

COND_ELSE_TRUECOND_ELSE_FALSE用于(2)中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值