预处理相关知识点

1、预处理指令标识符:_LINE_   _FILE_ _DATE_   _TIME_     #    ##

_LINE_//打印当前所在的行

_FILE_//打印当前错在的文件

_DATA_  打印当前日期

 _TIME_  打印当前日期


使用:

#include


int main()
{
printf("line=%d\n",__LINE__);
printf("file:%s\n",__FILE__);
printf("data:%s\n",__DATE'E__);
printf("time:%s\n",__TIME__);
return 0;
}


/#在字符串中包含宏参数,使其在预处理阶段进行替换,而不是最后以文本格式输出原字符串
#define SQR(n) \
printf("The square of n if %d.\n ",(n*n))
#define SQR1(n) \
printf("The square of "#n" if %d.\n ",(n*n))


int main()
{
SQR(10);
SQR1(10);
return 0;
}

///##将两个语言符号合并成一个语言符号
#define sum1 10
#define sum2 15
#define sum1sum2 20
#define SUM \
printf("sum=%d\n",sum1##sum2)
int main()
{
SUM;
return 0;
}

2、宏和函数的区别

属性

#define

函数

代码长度

每次使用时,宏代码都被插入到代码中,出了非常小的宏外,程序的的长度将大幅度增加

函数代码只出现在一个地方,每次使用时,都调用那个地方的那份代码

执行·速度

更快

存在函数调用的及返回的额外开销

操作符优先级

除非加上括号,否则临近操作符很可能导致不可预料的结果

没求一次值将结果返给函数,更容易预测

参数求值

每次用于宏调用时,参数将重新求值,多次求值,具有副作用,可能产生不可预测的结果

只求一次值,参数的副作用不会导致任何特殊问题

参数类型

与类型无关,只要操作是合法的,可用任何类型的参数

参数与类型有关,类型不同,就需要不同的函数














3、编译与链接
编译与链接有下面几个环节:
源程序->预处理->编译和优化->生成目标文件->链接->可执行文件
预处理:
预处理包含宏替换,头文件展开,去掉注释,条件编译是个部分。
编辑和优化以下几个方面:
词法分析 -- 识别单词,确认词类;比如int i;知道int是一个类型,i是一个关键字以及判断i的名字是否合法


语法分析 -- 识别短语和句型的语法属性;

 

语义分析 -- 确认单词、短语和句型的语义特征;


代码优化 -- 修辞、文本编辑;


代码生成 -- 生成译文。

汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。

链接:

由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。




     


你可能感兴趣的:(语言)