c语言编译和链接

一个.c源文件是如何经过处理变成可执行的.exe文件?

这其中经过了编译和链接两个大过程。总的来讲,就是每个源文件经过编译后生成对应地目标文件,然后所有的目标文件和所引用的标准库链接,形成了.exe文件。具体是怎样,我来讲一讲。

1.编译

a.预处理

此时.c文件进入预处理阶段,执行预处理命令。比如#define,#undef,(#ifdef,#endif),#error,#line等等。预处理结束后,将生成.i文件。

b.编译

此时.i文件进入编译阶段,此时编译器对.i文件进行语法分析,词法分析,语义分析,符号汇总,其实就是把c语言指令翻译成汇编指令,那么前三个就很好理解了,符号汇总是干什么呢?符号汇总是把文件中出现的一些函数名等一些特殊的名字记录下来,比如main。之后就生成一个.s文件。

c.汇编

此时.s文件进入汇编阶段,编译器将.s文件中的汇编指令翻译成二进制指令,生成.o文件。在这一阶段,将生成符号表,符号中的符号就是编译阶段中记下的特殊的名字,而表就是把这些名字和它的地址关联起来作出一个表。比如写了一个add函数,那么将add和add的地址联系起来,但是如果在这单独的.c文件中,只有add的声明,而没有定义,则将其地址记为0.

2.链接

链接很重要的一个地方就是合并符号表,在之前讲到,如果在这单独的.c文件中,只有add的声明,而没有定义,则将其地址记为0。而在另一个.c文件内发现了add的定义,则将add函数定义的地址替换掉这个0。然后将标准库中函数的地址也进行相同操作。

最后呢,就生成了可执行的.exe文件。

然后有几个需要注意的点

1.#include "stdio.h" 和 #include <stdio.h> 的区别

""的操作是先到本地文件中寻找,然后到标准库中寻找,而<>则是直接到标准库中寻找。所以对于本地的.h文件,使用 "" ,标准库应使用 <> 。

2.宏和函数的区别

a.宏比函数更快,宏只是一个寻找替换的过程,而调用函数,要现在栈区内开辟空间,然后开辟形参等一系列操作,所以对于简单的逻辑,宏更好。

b.宏没有参数限制,宏只是寻找替换,所以根本就不会检查参数。如下面这个宏。

复制代码
#define MALLOC(num, type) (type*)malloc(num * sizeof(type))
 
 
int main()
{
	int* x = MALLOC(10, int);
	if (x == NULL)
	{
		//------
		return 0;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
		x[i] = i;
	for (i = 0; i < 10; i++)
		printf("%d ", x[i]);
	return 0;
}

函数肯定写不出来这种效果,应该函数的参数是有类型限制的,没有一种参数它的类型是类型。

但是这样也说明,函数比宏更为严谨。

c.宏可能会有副作用

因为宏只是寻找替换,对于这样一个宏。

#define x(a, b) ((a > b)?(a):(b))

如果传入的a和b分别为a++,b++,这很有可能把某个++执行了两边。

d.宏不能调试,不能递归,而函数可以。

e.因为宏是寻找替换,所以每使用一个宏就会替换一次,这可能大大增加了代码量,而函数则不会。

3. 5个预编译符号

FILE//进行编译的源文件

LINE//文件当前的行号

DATE//文件被编译的日期

TIME//文件被编译的时间

STDC//如果编译器遵循ANSI C,其值为1,否则未定义

复制代码
int main()
{
	printf("%s\n %s\n %s\n %d\n",__FILE__,__DATE__,__TIME__,__LINE__);
	return 0;
}
相关推荐
钢琴上的汽车软件3 小时前
C 语言中const与指针:三种常见写法辨析
c语言·指针和const
ZK_H3 小时前
嵌入式c语言——关键字其6
c语言·开发语言·计算机网络·面试·职场和发展
ambition202424 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_4 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
yashuk5 小时前
C语言实现PAT练习及算法学习笔记,还有SQLite介绍
c语言·sqlite·开源项目·算法学习·pat练习
ACP广源盛139246256735 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
爱编码的小八嘎6 小时前
C语言完美演绎7-10
c语言
hhh3u3u3u8 小时前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
泛凡(Linyongui)8 小时前
PY32F002B实践之二--宠物腹背理疗仪项目介绍及头文件解析
c语言·keil·py32·32位单片机·腹背理疗仪项目实践
网域小星球10 小时前
C 语言从 0 入门(十四)|文件操作:读写文本、保存数据持久化
c语言·开发语言·文件操作·fopen·fprintf