C语言可变参数 code实现

 

// C语言可变参数测试(整数输入)
void TestIntFunc(int n, ...)
{
    long long* p1 = (long long*)(&n);       // 因为是64位系统,因此采用long long,堆栈地址存取是64位的
    for (int i = 0; i < n; i++) {
        printf("%lld, ", p1[i + 1]);
    }
    printf("\n");
}

int main (void)
{
    printf("%d, %d, %d\n", sizeof(int), sizeof(long),sizeof(long long));
    logSwitch = 1;
    TestIntFunc(6, 1, 2, 8, 18, 32, 17);
    return 0;
}

 

#include <stdarg.h>
#include <stdio.h>

int sum(int, ...);

int main()
{
   printf("15 和 56 的和 = %d\n",  sum(2, 15, 56) );
   return 0;
}

int sum(int num_args, ...)
{
   int val = 0;
   va_list ap;
   int i;

   va_start(ap, num_args);
   for(i = 0; i < num_args; i++)
   {
      val += va_arg(ap, int);
   }
   va_end(ap);
 
   return val;
}

 

 

#include <stdio.h>
#include <stdarg.h>

char buffer[80];
int vspfunc(char *format, ...)
{
   va_list aptr;
   int ret;

   va_start(aptr, format);
   ret = vsprintf(buffer, format, aptr);
   va_end(aptr);

   return(ret);
}

int main()
{
   int i = 5;
   float f = 27.0;
   char str[50] = "runoob.com";

   vspfunc("%d %f %s", i, f, str);
   printf("%s\n", buffer);
   
   return(0);
}

  

 1 #include <stdio.h>
 2 #include <stdarg.h>
 3 #include <time.h>
 4 
 5 #define LOG3(fmt, ...)          printf(fmt, ##__VA_ARGS__)
 6 //#define LOG3(fmt, ...)          printf("<%s:%s>:"fmt"\r\n", __FILE__, __FUNCTION__, ##__VA_ARGS__)
 7 void log4(int line, char *format, ...)
 8 {
 9     clock_t start =clock();
10     printf("<time:%f> ", (float)start / CLOCKS_PER_SEC);
11 
12     va_list aptr;
13     char buffer[80];
14     va_start(aptr, format);
15     printf(format, aptr);
16     va_end(aptr);
17 
18     printf(" <File:%s, line:%d>\n", __FILE__, line);
19 }
20 
21 int main(int argc, char** argv)
22 {
23     char *str = "hello";
24     int num = 10086;
25     log4(__LINE__, "hello Word  1 !!!");
26     LOG3("this is test __VA_ARGS__\n");
27     LOG3("this is test __VA_ARGS__:%s, %d \n", str, num);
28     LOG3("");
29 
30     log4(__LINE__, "hello Word  2 !!!");
31     return 0;
32 }

输出:

  

1 <time:0.126000> hello Word  1 !!! <File:E:\code\test1\main.cpp, line:177>
2 this is test __VA_ARGS__
3 this is test __VA_ARGS__:hello, 10086
4 <time:0.126000> hello Word  2 !!! <File:E:\code\test1\main.cpp, line:182>

 

 

 

 

 

 

 

 

参考链接

  C语言函数之可变参数原理:va_start、va_arg及va_end

  C 库函数 - vprintf()

  C语言中可变参宏的一种实现方式

  C 库函数 - vsprintf()

 

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

  C语言##__VA_ARGS__的用法

 

posted @ 2022-07-07 15:39  博客园—哆啦A梦  阅读(63)  评论(0)    收藏  举报