如何实现可变参数函数的传递

msgsnd 2006-07-04 11:21:33
#define log printf
如果不用宏,定义log函数调用printf如何实现
...全文
1318 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
msgsnd 2006-11-14
  • 打赏
  • 举报
回复
偶然间弄明白了其中的原因,分享如下:
1、vc不支持可变参数macro,但一般提供了一套函数可以变通,对应的
vprintg->printf
vsprintg->sprintf
_vnprintg->nprintf
2、linux支持可变参数macro
zez 2006-07-04
  • 打赏
  • 举报
回复

#include <stdarg.h>

void log(char* f, ...)
{
va_list args;
va_start( args, f );
vprintf(f,args); /////////////////////////这里!!
va_end(args);
}
sinkileu 2006-07-04
  • 打赏
  • 举报
回复
用<stdarg.h>中的va_arg, va_end, va_start.
可参看MSDN.
#include <stdio.h>
#include <stdarg.h>
int average( int first, ... );

int main( void )
{
/* Call with 3 integers (-1 is used as terminator). */
printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

/* Call with 4 integers. */
printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

/* Call with just -1 terminator. */
printf( "Average is: %d\n", average( -1 ) );
}

int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;

va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum += i;
count++;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}
jixingzhong 2006-07-04
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "stdlib.h"
void myprintf(char* fmt, ...) //一个简单的类似于printf的实现,//参数必须都是int 类型
{
char* pArg=NULL; //等价于原来的va_list
char c;

pArg = (char*) &fmt; //注意不要写成p = fmt !!因为这里要对//参数取址,而不是取值
pArg += sizeof(fmt); //等价于原来的va_start

do
{
c =*fmt;
if (c != '%')
{
putchar(c); //照原样输出字符
}
else
{
//按格式字符输出数据
switch(*++fmt)
{
case 'd':
printf("%d",*((int*)pArg));
break;
case 'x':
printf("%#x",*((int*)pArg));
break;
default:
break;
}
pArg += sizeof(int); //等价于原来的va_arg
}
++fmt;
}while (*fmt != '\0');
pArg = NULL; //等价于va_end
return;
}
int main(int argc, char* argv[])
{
int i = 1234;
int j = 5678;

myprintf("the first test:i=%d",i,j);
myprintf("the secend test:i=%d; %x;j=%d;",i,0xabcd,j);
system("pause");
return 0;
}
在intel+win2k+vc6的机器执行结果如下:
the first test:i=1234
the secend test:i=1234; 0xabcd;j=5678;
yuyuan830705 2006-07-04
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4824/4824772.xml?temp=.4704553
chenhu_doc 2006-07-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/laomai/

这里有资料!
msgsnd 2006-07-04
  • 打赏
  • 举报
回复
#include <stdarg.h>

void log(char* f, ...)
{
va_list args;
va_start( args, f );
printf(f,args);
va_end(args);
}

有问题啊
msgsnd 2006-07-04
  • 打赏
  • 举报
回复
int vprintf(char *format, va_list param);
没有用过vprintf,看了原形才知道,谢谢了。
那么我的问题岂不成了vprintf如何实现的了吗
tailzhou 2006-07-04
  • 打赏
  • 举报
回复
按lz是不想用vprintf的。
他就想在他的log函数内直接调用printf,并把log的可变参数"..."传递给printf的可变参数“...”。


我想编译器还不支持这样的功能。用其他的方法,比如镶入asm不知道能不能做的到
zez 2006-07-04
  • 打赏
  • 举报
回复
楼主..
我已经给你标准答案了..

你自己难道不看别人的回复么???
msgsnd 2006-07-04
  • 打赏
  • 举报
回复
谢谢各位,如何便利参数估计大家都知道,我想知道的是如何把变参传递下去。
#include <stdarg.h>

void log(char* f, ...)
{
va_list args;
va_start( args, f );
printf(f,args);
va_end(args);
}

void main()
{
int a=10;
log("aaa%s%d","hello:",a);
}
如何实现?不要重写实现printf,没意思,我们要利用printf

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧