• 可变参数 va_start va_arg va_end的使用


    /*
      1)定义一个va_list类型的变量,变量是指向参数的指针;
      2)va_start初始化刚定义的变量,第二个参数是最后一个显式声明的参数;
      3)va_arg返回变长参数的值,第二个参数是该变长参数的类型;
      4)va_end将a)定义的变量重置为NULL。
     */
    
    #include <stdio.h>
    #include <stdarg.h>
    #include <string.h>
    
    void printf1(int num, ...)
    {
    	int i;
    	// 定义一个
    	va_list args;
    	// 初始化va_list, 第二个参数是最后显示定义的参数
    	va_start(args, num);
    	for (i = 0; i < num; i++)
    		printf("%d ", va_arg(args, int));
    	printf("\n");
    	va_end(args);
    }
    
    void printf2(int num, int count, ...)
    {
    	va_list args;
    	int i; 
            // 最后一个显式声明的参数是count
    	va_start(args, count);
    	//va_start(args, count);
    	for (i = 0; i < num; i++)
    		printf("%d ", va_arg(args, int));
    	printf("\n");
    	va_end(args);
    }
    
    
    enum {
    	MSG_EXCESSIVE, MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR
    };
    
    int wpa_debug_level = MSG_INFO;
    
    void wpa_printf(int level, const char *fmt, ...)
    {
    	va_list ap;
    	// 最后一个显式声明的参数是fmt
    	va_start(ap, fmt);
    
    	if (level > wpa_debug_level)
    	{
    		// 将可变参数列表的格式化数据打印到stdout
    		vprintf(fmt, ap);
                    // 可以根据需要,将数据写入文件中
    	}
    
    	va_end(ap);
    }
    
    
    int main(int argc, char **argv)
    {
    	printf1(3, 1, 2, 3);
    
    	printf2(3, 4, 'a', 'b', 'c', 'd');	
    
    	wpa_printf(MSG_ERROR, "hello world, %s\n", "Tao");
    	wpa_printf(MSG_WARNING, "nice to meet you, %s\n", "Tao");
    	wpa_printf(MSG_DEBUG, "nice to meet you, %s\n", "Tao");
    
    	return 0;
    }
    
  • 相关阅读:
    动词的形态及变化(转)
    数论基础
    P1505 [国家集训队]旅游
    贪心常见题
    主席树
    卡常火车头
    AC自动机
    左偏树
    位运算
    Linux下Vim常用操作
  • 原文地址:https://www.cnblogs.com/helloworldtoyou/p/16703082.html
Copyright © 2020-2023  润新知