1.预处理阶段
1).实现的作用:
(1)实现宏替换
(2)将使用的头文件的展开
(3)取消注释
(4)条件编译
在unix编译中,预处理指令 gcc -E test.c test.i
下面在unix编写一个的简单的程序展示下
代码
预处理后结果
2).熟悉预处理标识符
__FILE__//进行编译的源文件名
__LINE__//文件当前行的行号
__DATE__//文件被编译的日期
__TIME__//文件被编译的时间
#argument//宏参数转换为一个字符串argument
##//将位于两边的符号连接成一个符号
下面写个例子来进一步了解
#include <stdio.h>
#include <Windows.h>
int main()
{
printf("file:%s\n", __FILE__);
printf("line:%d\n", __LINE__);
printf("date:%s\n", __DATE__);
printf("time:%s\n", __TIME__);
system("pause");
return 0;
}
#include <stdio.h>
#include <Windows.h>
#define M 30
#define PRINTF(FORMAT,VALUE)\
printf("the number of " #VALUE " is " FORMAT"\n", VALUE)
int main()
{
PRINTF("%d", M);
system("pause");
return 0 }
#include <stdio.h>
#include <Windows.h>
#define XHAME(a,b) (int)a##b
int main()
{
printf("%d\n",XHAME(2,3));
system("pause");
return 0;
}
2.宏与函数的区别
宏(#define):每次都需要在代码块中替换,所以代码的长度会大幅度增加。执行速度提高。宏参数的求值与表达式的上下程序有关,除非加上括号,就会产生由于操作符优先级带来的不可预料的结果。每次用于宏定义时,都将重新求值,会产生副作用。宏与类型无关。
函数:函数代码出现于一个地方,只需要调用不需要替换,代码长度较短。由于函数调用、返回值存在额外开销。函数只求值一次,多次使用参数不会导致多种求值过程,不会导致特殊问题。函数的参数与类型有关。
3.理解编译链接的整个过程和详细的每个过程
1)预处理阶段
unix下的指令:gcc -E test.c -o test.i(test.c为源代码)
2)编译——c语言代码转换为汇编代码
unix下的指令:gcc -S test.i -o test.s
3)汇编———汇编代码转换为二进制
unix指令:gcc -c test.i -o test.o
4)链接——将二进制代码链接成一个可执行程序
gcc test.o -o test1
./test1