#define BEGIN_FOR(index,calue1,size,value2)\
for(int index = value1;index<size;index+=value2)\
{
//这个上面缺了一个 } 需要END_FOR()补上
#define END_FOR() }//这个就是一个大括号用来结束宏的循环
用于在被调用函数不知道参数个数和类型时对可变参数表进行测试
#include
提供了va_list数据类型和va-start,va-argva-end三个变量
当被调用函数使用可变参数时 会声明一个va_list变量,va_list指向va-arg,va-end所需信息的位置
va-list是一个char类型指针
可变参数的宏
就是将括号里的东西全部替换到__VA_ARGS__处
并且__VA_ARGS__要和其他字符串通过空格分隔开 要不然会认为成一起的字符串
只能#define func(a,…) 不能(…,a)
__DATE__ 当前日期,一个以 “MMM DD YYYY” 格式表示的字符串常量。
__TIME__ 当前时间,一个以 “HH:MM:SS” 格式表示的字符串常量。
__FILE__ 这会包含当前文件名,一个字符串常量。
__LINE__ 这会包含当前行号,一个十进制常量。
__STDC__ 当编译器以 ANSI 标准编译时,则定义为 1;判断该文件是不是标准 C 程序。
__FUNCTION__ 程序预编译时预编译器将用所在的函数名,返回值是字符串;
#define A(...) (printf(__VA_ARGS__" - %d - %s/%s\n",__LINE__,__TIME__,__DATE__))
#define fun(...) cout __VA_ARGS__//注意加空格
#define LOG(...) printf("%d,%d" __VA_ARGS__)
#define LOG1(...) printf(__VA_ARGS__)
#define LOG2(a,...) printf("%d,%d,%d,%d" __VA_ARGS__ ,a)
int main()
{
A("这是一个可变宏");//这是一个可变宏 - 18 - 18:27:53/Aug 9 2022
LOG(,2,3);
fun(<<5);
LOG1("nume:%d",4)
LOG2(1, ,2,3,4);//printf("%d,%d,%d,%d" ,2,3,4 ,1);//其中一个,是用来分割形参 一个是用来传入
LOG2(1,,2,3,4);//printf("%d,%d,%d,%d" ,2,3,4 ,1);//从这里知道这个空格没有影响 编译出来有空格的原因在于 __VA_ARGS__ ,a都有空格 无论连续多少个空格 在存进__VA_ARGS__都只有一个例如LOG2(1,,2, 3,4);
return 0;
}
实际上只需要知道##的作用就是粘合剂
将
#define LOG2(a,…) printf(“%d,%d,%d,%d”,a ##VA_ARGS)//会将a和##__VA_ARGS__粘合在一起
比如
LOG2(1,2,3,4,5);//展开 printf(“%d,%d,%d,%d”,12,3,4,5);
