目录

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

一.##__**VA_ARGS__**简介

[__VA_ARGS__](https://www.codersrc.com/archives/9450.html) 在前面的文章也介绍了,有两个缺点:

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

#define LOGFUNC(...) (printf(__VA_ARGS__))

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

#define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)

对于__VA_ARGS__ 的缺点,使用 ##__VA_ARGS__ 直接完美解决!##__VA_ARGS__ 使用如下:

#define edebug(format, ...) fprintf (stderr, format, ##__VA_ARGS__)

二.##__VA_ARGS__经典案例

有时,我们想把调试信息输出到屏幕上,而有时则又想把它输出到一个文件中,可参考下面的例子:

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 函数不定长参数 ##__VA_ARGS__经典案例
//@Time:2021/07/10 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

//debug.c
#include <stdio.h>
#include <string.h>
//开启下面的宏表示程序运行在调试版本, 否则为发行版本, 这里假设只有调试版本才输出调试信息
#define _DEBUG
#ifdef _DEBUG
    //开启下面的宏就把调试信息输出到文件,注释即输出到终端
    #define DEBUG_TO_FILE
    #ifdef DEBUG_TO_FILE
        //调试信息输出到以下文件
        #define DEBUG_FILE "/tmp/debugmsg"
        //调试信息的缓冲长度
        #define DEBUG_BUFFER_MAX 4096
        //将调试信息输出到文件中
        #define printDebugMsg(moduleName, format, ...) {
            char buffer[DEBUG_BUFFER_MAX+1]={0};
            snprintf( buffer, DEBUG_BUFFER_MAX 
                    , "[%s] "format" File:%s, Line:%dn", moduleName, ##__VA_ARGS__, __FILE__, __LINE__ );
            FILE* fd = fopen(DEBUG_FILE, "a");
            if ( fd != NULL ) {
                fwrite( buffer, strlen(buffer), 1, fd );
                fflush( fd );
                fclose( fd );
            }
        }
    #else
        //将调试信息输出到终端
        #define printDebugMsg(moduleName, format, ...) 
                  printf( "[%s] "format" File:%s, Line:%dn", moduleName, ##__VA_ARGS__, __FILE__, __LINE__ );
    #endif //end for #ifdef DEBUG_TO_FILE
#else
    //发行版本,什么也不做
    #define printDebugMsg(moduleName, format, ...)
#endif  //end for #ifdef _DEBUG

int main(int argc, char** argv)
{
    int data = 999;
    printDebugMsg( "TestProgram", "data = %d", data );
    return 0;
}

以上代码可以实现以下功能:

  1. 通过使用 ##__VA_ARGS__ 可以输出不定长参数,功能和 printf 函数一样;
  2. 通过 DEBUG_TO_FILE 宏控制选择将日志输出到控制台或者输出到文件中;
  3. 通过 _DEBUG 宏决定是否输出日志,如果是开发用于调试,可以定义这个宏,方便查看日志,如果是给用户使用,那么可以不定义这个宏;

三.猜你喜欢

  1. C 语言 数组下标越界和内存溢出区别
  2. C 语言 使用指针遍历数组
  3. C 语言 指针和数组区别
  4. C 语言 指针数组和数组指针区别
  5. C 语言 野指针
  6. C 语言 函数值传递和址传递
  7. C 语言 函数不定长参数
  8. C 语言 函数指针
  9. C 语言 指针函数
  10. C 语言 回调函数 callback
  11. C 语言 #pragma once
  12. C 语言 #include <> 与 #include “” 区别
  13. C 语言 const 修饰函数参数
  14. C 语言 const 和 define 区别
  15. C 语言 #运算符
  16. C 语言 ##运算符
  17. C 语言 __VA_ARGS__
  18. C 语言 ##__VA_ARGS__
  19. C 语言 函数不定长参数 ##__VA_ARGS__经典案例

未经允许不得转载:猿说编程 » C 语言 函数不定长参数 ##__VA_ARGS__经典案例

本文由博客 - 猿说编程 猿说编程 发布!

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/shuopython/p/15294103.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!