常见的预处理符号
__FILE__ 代码所在文件名,
__LINE— 代码在多少行
__DATE__日期
__TIME__时间
可以直接用

常见的预处理指令
#include 头文件包涵
#pragma psck(4)设置默认对其数
#define,可以定义标识符常量,也可以定义宏
定义标识符常量
#define 名字 标识符常量
在预处理阶段就完成替换,因为是替换过去的所以不要加 ; 分号

宏的定义,允许把参数替换到文本中,这种通常叫做宏
#define 名字(参数) ()

这么写感觉没什么问题,那把传进去变成2+1,3+1呢

此时此刻值发生了变化,3*4不是12吗
因为是替换的关系 所以变成 2+1*3+1,有优先级
加上括号就是我们想要的样子,并不会因为优先级的关系,先算1*3;

在写宏的时候要 多用括号
宏的副作用
有副作用的宏#define MAX(x) (++x);
没有副作用的宏#define MAX(x) (x+1);
改变原数据的是有副作用的宏
# 和 ##
有没有宏能做到,而函数做不到的呢?
先看下面

函数恩能不能实现,比如,如果变量是a ,字符串中的变量是a,变量是b,字符串中的就是b呢
我们先把他分装一个函数。

由图可以看出函数实现不了,不管参数是什么,是都是n的值
难道真的实现不了了吗?能,用宏可以实现
讲这个的时候在,来个铺垫,先看我们的第一个代码

接下来我换个写法
#include<stdio.h>
int main() {
printf("hello ""word");
}可以打印吗??,当然可以

我们发现打印的时候从两个字符串好像变成一个字符串。这个是c语音特点,可以吧一个字符串,拆成几段来写
有了这个,下宏就好理解了,

#放在N前面的作用是什么呢
它会吧N不做任何的替换,转换成对应字符串,这里吧a转换成"a";
所以转换后的结果是printf("a""的值是%d",N);
接下来介绍##
##可以把他两边的符号合成一个符号
举个例子

由此可以看出,##作用是把两边的字符合成一个字符
undef 名字 移除一个宏定义
这个宏就用不了了
命令行定义
条件编译
#ifdef 名字 如果定义过执行,否则不执行
#endif
#if (常量表达式)如果表达式为真参与编译,否则不编译
#endif
#if
#elif
#else
#endif
就跟if else 一样
#if defined(定义) 定义过执行,否则不执行,
if !defined(定义) 定义过不执行 #ifndef 反面
可以嵌套
让头文件中引用一次
#ifdef 名字
#define 名字
#endif
或者
#pragma once 太老版本编不过去