以#开头的语句称为预处理语句
#include
#include<头文件名> //先从默认目录搜索头文件 #include"头文件名" //先从文件所在目录搜索头文件
#define
不带参
#define 宏名 字符串 //以字符串内容代替宏名(展开),可嵌套
#define PI 3.1415926 //other code double a=PI; //展开后该行为:double a=3.1415926;
带参宏
#define 宏名(形参列表) 字符串 //定义
宏名(实参列表) //调用时展开的同时用实参代替形参
#define ADD(x,y) x+y //other code ADD(5,6) //展开后该行为:5+6
操作符#和##
#操作符可将参数转为字符串
#define A(x) #x //other code A(!@#D"F"AS123); //展开后该行为:"!@#D"F"AS123"
##可将两个参数拼接起来
#define B(x,y) x##y //other code int x=B(23,33) //展开后该行为:int x=2333
注意:含有#或##的宏命令不支持嵌套。其内的其他宏不会被展开。
解决方法:加一层转换宏
#undef
取消#define
#if ... #elif ... #else ...#endif
功能参考if...elseif...else,但判断条件必须为常量表达式,不能为变量
#if 常量表达式
代码
#elif 常量表达式
代码
#elif 常量表达式
代码
...
#else
代码
#endif
#ifdef ... #else ... #endif
如果宏被定义过就编译其下的代码
#ifdef 宏名
代码
#else
代码
#endif
#ifndef ... #else ... #endif
如果宏没被定义过就编译其下的代码
#ifndef 宏名
代码
#else
代码
#endif
用宏有风险,装逼需谨慎