1、程序的翻译环境和执行环境
在ANSI C的任何一种实现中,存在两个不同的环境。
第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
第2种是执行环境,它用于实际执行代码。
我们在写程序的时候,写完之后此时生成的文件叫做.c源文件,然后会经历一个翻译环境,将.c文件变成.exe的可执行程序(当然这个程序我们是看不懂的,因为都是用二进制指令存储的),最后经过执行环境才会生成我们程序表达的内容。
2、详解编译和链接
2.1翻译环境
一个大型程序一般都是多文件,那么每个文件都会单独被编译器编译,然后生成对应的目标文件,多个目标文件组在一起再通过链接器进行链接,最终才会生成一份可执行程序。
2.2翻译环境也分多个阶段
这个是源文件到可执行程序的大致过程,这里面的知识点还有很多,我这里先画一张图大致让大家了解整个过程是怎样的。
2.3执行环境
程序执行的过程:
1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
2. 程序的执行便开始。接着便调用main函数。
3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行程
一直保留他们的值。
4. 终止程序。正常终止main函数;也有可能是意外终止。
3、预处理详解
3.1预定义符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
这些预定义符号都是语言内置的,可以直接用:
#include <stdio.h>
int main() {
printf("%s\n", __FILE__);
printf("%d\n", __LINE__);
printf("%s\n", __DATE__);
printf("%s\n", __TIME__);
}
3.2 #define
3.2.1#define定义标识符
语法:
#define name stuff
#define MAX