C语言 __VA_ARGS__ - C语言零基础入门教程
Published on 2022-08-23 10:43 in 分类: C/C++ with 萧海~
分类: C/C++

C语言 __VA_ARGS__ - C语言零基础入门教程

    一.__VA_ARGS__简介

    VA_ARGS 是一个可变参数的宏,是新的 C99 规范中新增的,目前似乎只有 gcc 支持( VC 从 VC2005 开始支持)。

    VA_ARGS需要配合 define 使用,总体来说就是将左边宏中 .. 的内容原样抄写在右边 VA_ARGS 所在的位置; 举个例子:

    #define myprintf(...) printf( __VA_ARGS__)

    示例代码如下:

    /******************************************************************************************/
    //@Author:猿说编程
    //@Blog(个人博客地址): www.codersrc.com
    //@File:C语言教程 - C语言 __VA_ARGS__
    //@Time:2021/07/10 08:00
    //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    /******************************************************************************************/
    #include <stdio.h>
    #define myprintf(...) printf( __VA_ARGS__)
    int main()
    {
    myprintf("0123456789\n");
    myprintf("www.codersrc.com\n");
    myprintf("C语言/C++教程-猿说编程\n");
    return 0;
    }
    /*
    0123456789
    www.codersrc.com
    C语言/C++教程-猿说编程
    */

    注意:VA_ARGS 只能是一些不含任何变量的字符串常量。如果 VA_ARGS 含有变量,整个 printf 的输出与变量便不能一一对应,输出会出错。

    二.__VA_ARGS__使用

    DATE 当前日期,一个以 “MMM DD YYYY” 格式表示的字符串常量。

    TIME 当前时间,一个以 “HH:MM:SS” 格式表示的字符串常量。

    FILE 这会包含当前文件名,一个字符串常量。

    LINE 这会包含当前行号,一个十进制常量。

    STDC 当编译器以 ANSI 标准编译时,则定义为 1;判断该文件是不是标准 C 程序。

    FUNCTION 程序预编译时预编译器将用所在的函数名,返回值是字符串;

    1.__VA_ARGS__宏输出字符串常量

    /******************************************************************************************/
    //@Author:猿说编程
    //@Blog(个人博客地址): www.codersrc.com
    //@File:C语言教程 - C语言 __VA_ARGS__
    //@Time:2021/07/10 08:00
    //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    /******************************************************************************************/
    #include <stdio.h>
    #define LOGFUNC(...) (printf(__VA_ARGS__" - %d - %s/%s\n",__LINE__,__TIME__,__DATE__))
    int main()
    {
    LOGFUNC("0123456789");
    LOGFUNC("www.codersrc.com");
    LOGFUNC("C语言/C++教程-猿说编程");
    return 0;
    }
    /*
    0123456789 - 9 - 07:52:40/Jul 11 2021
    www.codersrc.com - 10 - 07:52:40/Jul 11 2021
    C语言/C++教程-猿说编程 - 11 - 07:52:40/Jul 11 2021
    */

    缺点:

    1. 只支持字符串,不支持可变参数或者多个参数;VA_ARGS
      只能是一些不含任何变量的字符串常量。
    2. 如果 VA_ARGS 含有变量,整个 printf 输出与变量便不能一一对应,输出会出错;
    #include <stdio.h>
    #define LOGFUNC(...) (printf(**VA_ARGS**" - %d - %s/%s\n",**LINE**,**TIME**,**DATE**))
    int main()
    {
    LOGFUNC("0123456789");//OK
    //错误写法:只支持字符串,不支持可变参数或者多个参数
    LOGFUNC("%d,%d",1,2); //编译报错
    return 0;
    }

    2.__VA_ARGS__宏输出可变参数

    #include <stdio.h>
    #define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)
    int main()
    {
    //输出可变参数
    LOGSTRINGS("0123456789,%d%s",1,"sd"); //OK
    //输出字符串常量报错
    //LOGSTRINGS("C语言/C++教程-猿说编程");
    /*LOGSTRINGS("C语言/C++教程-猿说编程");报错如下:
    main.cpp: In function ‘int main()’:
    main.cpp: error: expected primary-expression before ‘)’ token
    3 | #define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)
    */
    return 0;
    }

    三.__VA_ARGS__缺点

    1.仅仅只支持字符串常量,不支持可变参数

    define LOGFUNC(...) (printf(VA_ARGS))

    2.仅仅只支持可变参数,不支持字符串常量

    define LOGSTRINGS(fm, ...) printf(fm,VA_ARGS)

    那么如何才能解决 VA_ARGS 既能支持常规字符串也能支持可变参数问题,我们可以留到下一篇文章通过 ##VA_ARGS 实现!

    https://zhuanlan.zhihu.com/p/410584385

    posted @   萧海~  阅读(1900)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · winform 绘制太阳,地球,月球 运作规律
    · AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
    · 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
    · 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
    · 上周热点回顾(3.3-3.9)
    点击右上角即可分享
    微信分享提示
    电磁波切换