程序翻译的过程
预处理,编译, 汇编,链接
其中预处理包括:
头文件的展开, 宏替换,去注释,条件编译
预处理
1.0用宏定义充当注释符号

2.0用 define 宏定义表达式

- else匹配if时,直接报错了
最完美的解决方案
该宏最大的特征是,替换的不是单个变量/符号/表达式,而是多行代码
其实,带上花括号也行,但是没有这样做好
3.0宏定义中的空格

在#define和符号之间是可以有空格的(第七行),但是尽量不要这样写
4.0#undef

undef
的本质作用

5.0条件编译
条件编译能通过**裁剪代码**,快速实现版本维护(free,收费),功能裁剪,跨平台性等等
演示#ifdef

在#ifdef中如果定义该符号,就执行
演示#ifndef

在#ifndef中如果没有定义该符号,就执行
多条件的情况

#if判断的是真假
其他样例


#if defined也是支持嵌套的
6.0头文件的展开
关于解决头文件被重复包含的解决方案


条件编译来解决头文件被重复包含的问题,不仅限于此
7.0#error
预处理
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//#define __cplusplus
int main()
{
#ifndef __cplusplus
#error 老铁,你用的不是C++的编译器哦
#endif
return 0;
}

8.0#line
预处理
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
//C预定义符号,代表当前文件名和代码行号
printf("%s, %d\n", __FILE__, __LINE__);
#line 60 "hehe.h" //定制化完成
printf("%s, %d\n", __FILE__, __LINE__);
return 0;
}

#line定制化文件名称和代码行号
9.0#pragma
预处理
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define M 10
int main()
{
#ifdef M
#pragma message("M宏已经被定义了") //下发
#endif
return 0;
}
#pragma message()作用:
可以用来进行对代码中特定的符号(比如其他宏定义)进行是否存在进行编译时消息提醒
但是我在vs2019中演示不出来,感兴趣的可以试试
10.0#
运算符
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define TOSTRING(s) #s
int main()
{
int abc = 12345;
char str[64] = { 0 };
strcpy(str, TOSTRING(abc));
printf("%s", str);
return 0;
}
将参数符号s对应的文本内容,转换成为"字符串"
11.0##
预算符

3.14e3是指数的科学计数法,这个运算符会将##相连的符号和合成一个新的字符,