问:
1. 什么是C语言的源代码?
2. 由于计算机只认识什么?因此它只能接收与执行什么?也就是什么?
3. 在ANSI C的任何一种实现中,存在哪两个不同的环境?在这两种环境里面分别干什么事情?
4. 因此什么东西依赖翻译环境?翻译环境实际上就是把什么经过一系列处理变成什么?
5. 翻译环境中的操作在VS上的具体体现演示一下?
6. 后缀为.exe文件里面包含的就是什么?也叫什么?
7. 由于VS2019是什么?因此自然能提供什么与什么?
8. 画出两张翻译环境中运转的简图?并且笼统简述一下?
9. 在翻译环境下又可以分成哪两个过程?然后其中的什么又可以细分为什么,什么与什么?
10. 每个.c文件都会怎么样地先经过什么阶段?可以手动通过什么在该阶段完了之后生成什么?但系统不会怎么样?在该阶段主要干什么,什么与什么?其中什么有比如什么,什么等等?因此总结一下,都是些什么操作?如什么与什么?
11. 接下来进入什么阶段?gcc会默认自动生成什么?这一步实际上就是在干什么?有各种具体细节,其中什么需要特别介绍?所谓的什么就是指什么与什么?然后把它们怎么样?
12. 然后进入什么阶段?gcc会默认自动生成什么?即什么?当生成该文件时,文件里面已经是什么了?发现直接打开怎么样?需要怎么样?elf就是什么?会怎么样?所以汇编阶段就是干什么?其中有哪个步骤特别要注意?它就是把之前的什么在加上什么就形成了一个什么?
13. 什么完成之后就是什么了?该阶段有哪两个步骤?第一个具体是什么?第二个具体是什么?并且怎么样?这时候什么的作用体现出来了?在什么的时候就需要通过什么去查找,如果在该什么查不到对应的内容,就会怎么样?
14. 什么过后就进入了什么?什么必须载入到什么当中?这个一般由谁会完成?程序从什么开始执行?在这过程中会有什么的开辟,什么也称为什么?程序还可以把数据放在哪里?等等,最后程序会终止。
15. 尤其要对什么进行详解?该阶段主要处理什么,什么还有什么?但需要牢记,都仅仅是什么?如什么与什么?
16. 预定义符号是怎么样的?在预处理阶段就会被怎么样?预定义符号有哪5个?
17. #define 预处理指令有哪两个形式?但核心都可以用什么来概括?写的时候不要加什么?不要吝啬什么?
18. #define 预处理指令在什么过程中尤其要注意什么?同时在什么过程中,什么是不会怎么样的?
19. 什么是宏?#define 定义宏本质上是什么?宏不能出现什么?
20. Solve the problems: 写一个程序快速高效地比较两个数的大小?
21. 详细解释一下带副作用的宏参数的易犯错之处?并解释原因?
22. #pragma once 是用来干什么的?还可以怎么实现这个目的?
答:
1. 也就是我自己写的test.c文件里面的代码。
2. 二进制,二进制指令,可执行的机器指令。
3. 翻译环境,执行环境,翻译环境就是把我写的源码转化为计算机能够看懂的二进制指令(可执行的机器指令),执行环境里就是实际执行代码。
4. 源码转化为计算机能识别的机器指令,test.c,test.exe。
5. 自己实操一下。
6. 可执行的机器指令,二进制指令。
7. 集成开发环境,翻译环境,执行环境。
8.
9. 编译与链接,编译,预处理(预编译),编译,汇编。
10. 各自独立互不联系,预处理,gcc命令,×××.i文件,默认自己生成,处理预定义符号,处理预处理指令,删除注释,预处理指令,#include,#define定义的标识符与宏,文本,替换,删除。
11. 编译,×××.s,把C语言预处理后的代码翻译成汇编代码,符号汇总,符号,具有全局性质的变量名,函数名,汇总记录。
12. 汇编,×××.obj/o文件,目标文件,二进制指令,打不开的,借助工具readelf,目标文件的格式,将自己划分为一个一个段,把汇编语言转化为二进制机器指令,形成符号表,汇总的符号,相应的地址,符号表。
13. 编译,链接,合并段表与符号表的合并与重定位,合并段表就是把之前互相独立的obj文件里面各自的段整合在一起,符号表的合并与重定位就是把之前互相独立的编译过程产生的各自的符号表整合在一起,有之前生成的随机地址的话就用正确的地址替代掉,符号表,链接,符号表,地址处,报错。
14. 翻译环境,执行环境,程序,内存,操作系统,main函数,函数栈帧,函数栈帧,运行时堆栈,静态区。
15. 预处理阶段,预定义符号,预处理指令,删除注释,文本操作,替换,删除。
16. 语言内置的,替换掉,如图:
17. 定义标识符,定义宏,文本替换,分号,括号。
18. 文本替换,不能凭借数学直觉自己加括号,文本替换,字符串,被搜索进去的。
19. #define机制允许把参数替换到文本中,文本替换,递归。
20.
#define MAX(x,y) ((x)>(y)?(x):(y))
21. 不能按照函数的思维去思考,因为宏在源码的预处理阶段就已经被无脑文本替换掉了不会涉及到任何的运算。
22. 为了防止头文件被重复包含,
#ifndef __T1_H__
#define __T1_H__
int Add(int x, int y);
#endif
个人觉得了解一下:
#define定义宏时的#与##符号?
宏与函数的对比?
命令行定义与条件编译?
#undef是什么?
#include <Elon.h>与 #include"Elon.h"的区别?