前言
在ANSI C的任何一种实现中,存在两个不同的环境
第一种是翻译环境,在这个环境中源代码被转换成可执行的机器指令。
第二种是执行环境,它用于实际执行代码。
一、编译+链接是什么?
(一)、翻译环境
首先我们先以一幅图来导入我们本章其中的知识点。
1、组成一个程序的每一个源文件通过编译过程分别转换成目标代码(object code)
2、每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
3、链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。
二、预处理的讲解
1.预定义符号
FILE //进行编译的源文件
LINE //文件当前的行号
DATE //文件被编译的日期
TIME //文件被编译的时间
STDC//如果编译器遵循ANSI C,其值为1,否则未定义
此时我就带大家来测试一下关于vs这款微软制作的编辑器是否遵循ANSI C标准,我们会发现在vs这款编译器中是不支持这个标识符的,所以可以得出微软制作的这款vsstudio不是遵循ANSI C的
2.#define定义标识符
语法:#define stu student
#define MAX 1000 #define reg register //为 register这个关键字,创建一个简短的名字 #define do_forever for(;;) //用更形象的符号来替换一种实现 #define CASE break;case //在写case语句的时候自动把 break写上。 // 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。 #define DEBUG_PRINT printf("file:%s\tline:%d\t \ date:%s\ttime:%s\n" ,\ __FILE__,__LINE__ , \ __DATE__,__TIME__ )
那么此时我就想提一个疑问出来了?在define定义标识符的时候,要不要在最后加上:?
如一下代码所示,我们发现在编译器上他是报错的,那么这是为什么呢?我很不解不是说define可以定义嘛?为什么这又不行了呢?其实在预编译的过程中它会转换成这样,我们可以想象一下正常情况下if如果有两条以上的语句,那么我们是不是需要加上括号呢?对没错,是的,我们需要加上,那是不是我们就在不经意之间,突然就犯了一个致命的错误,并且我们还不知道!
#include<stdio.h> #define MAX 1000; #define reg register //为 register这个关键字,创建一个简短的名字 #define do_forever for(;;) //用更形象的符号来替换一种实现 #define CASE break;case //在写case语句的时候自动把 break写上。 // 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。 #define DEBUG_PRINT printf("file:%s\tline:%d\t \ date:%s\ttime:%s\n" ,\ __FILE__,__LINE__ , \ __DATE__,__TIME__ ) int main() { int max = 0; if (1) max = MAX; else max = 0; return 0; }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0M8fIa9i-1681278852763)(ht
]
tps://img-blog.csdnimg.cn/b2bd2e4546814d598c00d195515f4c0b.png)
总结
以上就是今天要讲的内容,本文仅仅简单介绍了程序环境和预处理!我们下期再见!