既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
#include<stdio.h>
int main()
{
printf("file:%s\nline:%d\n",\_\_FILE\_\_,\_\_LINE\_\_);
}
如以上代码打印了源文件和当前行号:
二.#define
1.#define定义标识符
使用方法:#define 标识符 常量
#define定义的标识符,在预处理时会完成替换。
替换后,代码中不再含有标识符。
上图中的标识符MAX,STRING经过预处理后被替换成100,“abcdef”。
2.#define定义宏
#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)。
下面是宏的申明方式:
#define name( parament-list ) stuff
其中的parament-list是一个由逗号隔开的符号表,他们可能出现在stuff中。
我们仍然举例说明:
#define SUB(x,y) x-y
int main()
{
int a = 10;
int b = 20;
int c = SUB(a, b);
printf("%d", c);
}
上述代码中,在进行替换时,a,b作为参数也替换了x和y。
这就叫做宏。
Tips:参数列表的左括号必须和name相邻,如果之间有空白,参数列表就会变成stuff的一部分。
即下图的情况:
3.#define替换规则
宏替换发生在程序运行的预处理阶段,不进行实质性的程序运算,只做简单的文本替换。
如何理解这个文本替换呢?
请看以下代码:
#define SQUARE(x) x\*x
int main()
{
int a = 10;
int b = SQUARE(a);
int c = SQUARE(a+1);
printf("%d\n", b);
printf("%d\n", c);
}
输出结果为100 和 21.
如下图:
由于是文本替换,不会自动给我们加上括号,
基于操作符的优先级,没有达到我们想要的效果。
因此在写宏的时候,不要吝啬括号,这样可以防止出错。
#define SQUARE(x) ((x)\*(x))
//完善后,单独的元素带括号,总体的结果也带了括号
4. # 和 ##
#的使用:
我们看以下代码,发现两个printf有很大的相似性。
可不可以其他们封装成一个函数Print呢?
#include<stdio.h>
int main()
{
int a = 10;
printf("the value of a is %d\n",a);
int b = 10;
printf("the value of b is %d\n",b)
}
似乎是不行的,我们没法改变字符串里面的N为a或者b。
void Print(int n)
{
printf("the value of N is %d\n", n);
}
难道就这样没有办法了吗?
我们先看以下代码的输出:
int main()
{
printf("Nice shoot!!!\n");
printf("Nice ""shoot!!!\n");
}
执行后我们发现输出是一样的。
这说明C语言里的字符串会自动连接。
如下图:
这就有说法了,
如果我们利用这个特点,在两个字符串中间插入a,b的通式,不就能够完成了吗?
我们定义一个宏,
利用#操作符将参数直接转换成字符串,
即把参数N变为“N”,
字符串连接后就形成了我们想要的效果。
#define Print(N) printf("the value of "#N" is %d\n",N);
int main()
{
int a = 10;
Print(a);
int b = 20;
Print(b);
}
输出为
我们可以再深一步,如果a和b的数据类型不同,应该怎么写,来继续达到我们的目的?
#define Print(N,format) printf("the value of "#N" is "format"\n",N)
int main()
{
int a = 10;
Print(a,"%d");
double b = 20.0;
Print(b,"%lf");
}
没错,我们可以把打印格式作为参数传入写成通式。
##的使用:
用于将其两边的符号合成为一个:
如以下代码:
#define CAT(Tf,boys) Tf##boys
int main()
{
int CAT(Tf, boys) = 5;
printf("%d", Tfboys);
}
5.带副作用的宏参数
我们看以下代码:
int main()
{
int a = 2;
int b = a + 1;
int b = ++a;
}
a+1和++a都给b赋值3,结果是同样的。
但++a的同时对a造成了改变,我们将其视为副作用。
这个副作用可能在我们意识不到的时候出错。
在宏定义中我们应该尽量避免。
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
int a = 5;
int b = 8;
int c = MAX(a++, b++);
printf("%d\n", c);
printf("%d\n", a);
![img](https://img-blog.csdnimg.cn/img_convert/711a83fba7074e254c0edabdbb8d9522.png)
![img](https://i-blog.csdnimg.cn/blog_migrate/a247debc478f3b8c676320956a364176.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
xnZtpx-1715692684877)]
[外链图片转存中...(img-SMuL54nU-1715692684877)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**