__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
int main() {
printf("hello ""word");
}
可以打印吗??,当然可以
我们发现打印的时候从两个字符串好像变成一个字符串。这个是c语音特点,可以吧一个字符串,拆成几段来写
有了这个,下宏就好理解了,
#放在N前面的作用是什么呢
它会吧N不做任何的替换,转换成对应字符串,这里吧a转换成"a";
所以转换后的结果是printf("a""的值是%d",N);
##可以把他两边的符号合成一个符号
举个例子
由此可以看出,##作用是把两边的字符合成一个字符
这个宏就用不了了
条件编译
#ifdef 名字 如果定义过执行,否则不执行
#endif
#if (常量表达式)如果表达式为真参与编译,否则不编译
#endif
#if
#elif
#else
#endif
就跟if else 一样
#if defined(定义) 定义过执行,否则不执行,
if !defined(定义) 定义过不执行 #ifndef 反面
可以嵌套
#ifdef 名字
#define 名字
#endif
或者
#pragma once 太老版本编不过去