C语言最终讲:预处理详解
结语:这一讲是C语言基础知识的最后一讲了,后续将会学习数据结构相关的知识,坚持不易,希望各位都能坚持在自己所干的事情上,我们共勉
这一讲讲的是预处理相关的内容,上一讲虽然我们已经了解了一些关于#define相关的知识,这一讲我们讲详细阐述它的作用和缺陷
1.预定义符号
C语言中有着一些预定义符号,可以直接使用,是在预处理阶段进行处理的:
__FILE__ //进⾏编译的源⽂件
__LINE__ //⽂件当前的⾏号
__DATE__ //⽂件被编译的⽇期
__TIME__ //⽂件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
它们的使用方法为:
int main()
{
printf("%s\n", __FILE__);//打印当前文件所在的位置
printf("%d\n", __LINE__);//打印行号
printf("%s\n", __DATE__);//打印日期
printf("%s\n", __TIME__);//打印时间
//printf("%d\n", __STDC__);//err,表明VS并不完全遵循ANSI C标准
return 0;
}
运行结果如下:
2.#define定义常量
我们知道,define定义的常量是直接替换的,所以有着下面的几处用法:
#define TEST 20 //方法1,直接定义常量
#define I int//方法2:可以为关键字替换成一个更简便的名字
#define CASE break;case//方法3:这是一种很“奇葩”的用法,建议还是别用了
int main()
{
//使用起来也很方便,方法1:
int a = TEST;//直接使用即可
//方法2:
I b = 20;
printf("%d\n", b);
//方法3:
int input = 1;
scanf("%d", &input);
switch (input)
{
case 1:
CASE 2 ://这样后面就不用加break了
CASE 3 :
break;
}
return 0;
}
对于加;问题,解答如下:
#define ROW 20;//假设#define定义时加上了;
int main()
{
int a = ROW;//这是a就会被替换成int a = 20;;这是后面就会有两个;,特殊情况下会出现错误
//总结:加上;可能会出现错误,不加;肯定不会出现错误,所以还是不要加上;
return 0;
}
3.#define定义宏
定义方式:
#define name( parament-list ) stuff
name为宏名称
parament-list是由逗号隔开的符号表,可能出现在stuff中
stuff可以是一个计算方式,也可以是一个指令等等
//需要注意的是,符号表的左括号必须要和name紧密相连,否则括号里的内容也会被当成是stuff中的一部分
使用实例:
#define MUL(x) x*x//定义了一个宏,实现x的平方
int main()
{
int a = 5;
int b = MUL(a);
printf("b = %d\n", b);
//结果为25
return 0;
}
看起来使用起来很好用,但是我们也要注意符号的优先级问题,如下:
#define ADD(x) x+x
int main()
{
int a = 5;
int b = ADD(a)