预处理(C语言)

程序的翻译环境和执行环境

在ANSI C的任何一种实现中,存在两个不同的环境

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
第2种是执行环境,它用于实际执行代码。

基本情况如下图:

程序的翻译环境

编译:

预编译 编译 汇编

1、预编译(文本操作)(test.c(C语言代码)->test.i(C语言代码)):

1、头文件的包含
    #include----预处理指令
2、删除注释
3、#define定义
    符号的替换

2、编译(test.i(C语言代码)->test.s(汇编代码):

将c语言代码转换成汇编代码

1、语法分析

2、词法分析

3、语义分析

4、符号汇总
    全局符号汇总

3、汇编(test.s(汇编代码)->test.o(二进制指令)):

//目标文件在linus环境下是.o
//目标文件在windox环境下是.obj
1、形成符号表
    给符号汇总中的符号配上地址

链接(test.o add.o->a.out(可执行程序)):

1、合并段表
2、符号表的合并和重定位

1、

2、

默认填充值(没有任何意义)

多个目标文件进行链接的时候会通过符号表查看来自外部符号是否真实存在

程序的执行环境

程序执行的过程:
1、 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
2、程序的执行便开始。接着便调用main函数。

3、开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
4、 终止程序。正常终止main函数;也有可能是意外终止。

源程序到运行的全过程

详解预处理

预处理符号

__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义 vs2019不完全遵循,不能使用__STDC__

使用:

#include<stdio.h>
int main()
{
    printf("%s\n",__FILE__);//文件名
    printf("%s\n",__LINE__);//这一行行数
    printf("%s\n",__DATE__);//日期
    printf("%s\n",__TIME__);//时间
}

实例;记录日志

int main()
{
    FILE*pf=fopen("log.txt","w");
    if(pf==NULL)
    {
        return 1;
    }
    for(i=0;i<10;i++)
    {
        fprintf(pf,"%s %s %s %d %d",__DATE__,__TIME__,__FILE__,__LINE__,i);
    }
    fclose(pf);
    pf=NULL;
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值