您的位置:首页 > 其它

预处理阶段知识概要

2016-10-18 22:30 113 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unix