• C++-宏


    用宏来做个循环

    #define	BEGIN_FOR(index,calue1,size,value2)\
    for(int index = value1;index<size;index+=value2)\
    {
    //这个上面缺了一个	} 需要END_FOR()补上
    #define END_FOR() }//这个就是一个大括号用来结束宏的循环
    
    • 1
    • 2
    • 3
    • 4
    • 5

    什么是可变参数

    用于在被调用函数不知道参数个数和类型时对可变参数表进行测试

    #include
    
    • 1

    提供了va_list数据类型和va-start,va-argva-end三个变量
    当被调用函数使用可变参数时 会声明一个va_list变量,va_list指向va-arg,va-end所需信息的位置
    va-list是一个char类型指针

    VA_ARGS 一般配合 (…)使用

    可变参数的宏
    就是将括号里的东西全部替换到__VA_ARGS__处
    并且__VA_ARGS__要和其他字符串通过空格分隔开 要不然会认为成一起的字符串
    只能#define func(a,…) 不能(…,a)

    __DATE__ 当前日期,一个以 “MMM DD YYYY” 格式表示的字符串常量。
    
    __TIME__ 当前时间,一个以 “HH:MM:SS” 格式表示的字符串常量。
    
    __FILE__ 这会包含当前文件名,一个字符串常量。
    
    __LINE__ 这会包含当前行号,一个十进制常量。
    
    __STDC__ 当编译器以 ANSI 标准编译时,则定义为 1;判断该文件是不是标准 C 程序。
    
    __FUNCTION__ 程序预编译时预编译器将用所在的函数名,返回值是字符串;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    例子

    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    ##VA_ARGS

    实际上只需要知道##的作用就是粘合剂

    #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);

    查看宏展开结果

    在这里插入图片描述

  • 相关阅读:
    时序预测 | Matlab实现CNN-XGBoost卷积神经网络结合极限梯度提升树时间序列预测
    【APUE】文件系统 — 目录和文件
    Perl学习教程之单行命令详解
    JavaWeb基础
    Spark SQL简介
    【python 小白到精通 | 课程笔记】第四章:问题拆分与网络爬虫
    接着说说mysqlbinlog解析工具如何做数据恢复
    那些破釜沉舟入局Web3.0的互联网精英都怎么样了?
    java毕业设计程序设计类课程的课堂教学效果评价系统Mybatis+系统+数据库+调试部署
    Filebeat+Kafka+ELK
  • 原文地址:https://blog.csdn.net/qq_43535469/article/details/126253426