预处理阶段完成的事情:
1、取消注释,
2、宏替换,
3、头文件展开,
4.、条件编译。
先来熟悉几个常见预处理标识符,直接通过示例代码实现:
#include <stdio.h>
int main()
{
printf("file:%s line:%d date:%s time:%s\n", __FILE__, __LINE__, __DATE__, __TIME__);
system("pause");
return 0;
}
define宏替换步骤
1.在调用宏时,首先对参数进行检查,看看是否包含了任何由define定义的符号。如果是,它们首先被替换。
2.替换文本随后被插入到程序中原来文本的位置。对于宏,参数值被它们的值所替代。
3.最后,再次对结果文本进行检查,若包含define定义的符号 ,就重复上述步骤。
但是,宏不可以出现递归,通俗来讲,宏中不能在调用自身宏。
#include <stdio.h>
#define PRINT(FORMAT,VALUE) \
printf("the value of "#VALUE \
" is "FORMAT"\n",VALUE)
int main()
{
int x=10;
PRINT("%d", x + 5);
system("pause");
return 0;
}
LINUX下代码预处理阶段:
#include <stdio.h>
#define STR1 "hello"
#define STR2 "world"
#define STR1STR2 "hello bit"
#define PRINT(a,b)\
STR1##STR2
int main()
{
printf("%s\n", PRINT(STR1, STR2));
system("pause");
return 0;
}
define定义的宏与函数
宏只是简单的替换,宏与类型无关
宏是在预处理阶段被替换,函数是在代码运行阶段被调用生成。宏与函数各有优劣,使用时需适当选择,详细内容参见(C和指针P285)的表格。
宏在使用时,需要注意优先级问题,解决这种问题,就是加上一对()。
此处就不再举例。
编译链接的每个过程
以LINUX具体代码实现为例说明编译链接的整个过程:
源程序
1、预处理阶段
2、编译阶段(C语言代码–>汇编代码)
3、汇编阶段(汇编代码–>二进制代码)
4、链接阶段
将多个二进制程序链接成可执行程序。
完成了翻译阶段的4个任务,接下来就是执行阶段。