编译C程序涉及很多步骤:
生成可执行文件一般分为4步:
1.预处理
2.编译
3.汇编
4.链接
预处理主要完成四件事:
(1)头文件展开
(2)宏替换
(3)去注释
(4)条件编译
⼀、 ⽂件名约定
C的源代码保存于.c扩展名命名的⽂件中。头⽂件保存于扩展名为.h的⽂件中。
产⽣的⽬标⽂件名在类unix系统中扩展名为.o,在WIN X系统中扩展名是.obj。
⼆、编译和链接在类unix系统中:
1.编译并链接⼀个完全包含于⼀个源⽂件的c程序:
acprogram.c
2.这条命令产⽣⼀个a.out的可执⾏程序。中间会产⽣⼀个名为program.o的⽬标⽂件,但是它在链接完成之后被删除。
3.编译并链接⼏个源⽂件:
acmain.c sort.c lookup.c
4.编译⼀个C源⽂件,并把它和现存的⽬标⽂件链接在⼀起。
acmain.o lookup.o sort.c
5.编译单个C源程序,并产⽣⼀个⽬标⽂件,以后再进⾏链接:
ac–c program.c
6.编译⼏个C源程序,并为每个⽂件产⽣⼀个⽬标⽂件:
ac–c main.c sort.c lookup.c
7.链接⼏个⽬标⽂件:
acmian.o sort.o lookup.o
8.⽬标⽂件也可以指定的:
ac–o name program.c
1.1.2执⾏
程序执⾏的过程:
1.程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。
2.程序的执⾏便开始。接着便调⽤main函数。
3.开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈
(stack),存储函数的局部变量和返回地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。
4.终⽌程序。正常终⽌main函数;也有可能是意外终⽌。
编译过程:
熟悉预处理标识符:
FILE //进⾏编译的源⽂件
LINE //⽂件当前的⾏号
TIME //⽂件被编译的时间
DATE//文件被编译的日期
STDC //如果编译器遵循ANSI C,其值为1,否则未定义
如:
int main()
{
printf("FILE:%s\nLINE:%d\nDATE:%s\nTIME:%s\n", __FILE__, __LINE__, __DATE__, __TIME__);
return 0;
}
这样可以输出当前编译⽂件的相关信息。
#
⽤预处理器将⼀个宏参数转换为⼀个字符串。(#argument 这种结构被处理器翻译为"argument")
#与##用法
//⽤预处理器将⼀个宏参数转换为⼀个字符串。(#argument 这种结构被处理器翻译为"argument")
//结构则执⾏⼀种不同的任务。它把位于它两边的符号连接成⼀个符号(粘贴作用)
#include
#define VALUE 9
#define VALUE 9
//续行宏定义传参 验证#用法
#define PRINT( FORMAT, VALUE ) \
printf("The value of " #VALUE " is " FORMAT"\n", VALUE);
//验证##粘贴作用
#define CAT(STR1,STR2) STR1##STR2
int main()
{
PRINT("%d", VALUE);
CAT("Hello,", "world!");
printf("%s\n",CAT("HELLO,","WORLD!"));
return 0;
}