在C++中,如何定义一个带可变参数列表的函数?

CSharpP 2003-10-15 03:05:08
说的是定义,不是声明啊!
如:
定义一个函数,要求输出自己的函数名和参数列表!怎么写?
...全文
530 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
我不懂电脑 2003-10-15
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdarg.h>

/* calculate sum of a 0 terminated list */
void sum(char *msg, ...)
{
int total = 0;
va_list ap;
int arg;
va_start(ap, msg);
while ((arg = va_arg(ap,int)) != 0) {
total += arg;
}
printf(msg, total);
va_end(ap);
}

int main(void) {
sum("The total of 1+2+3+4 is %d\n", 1,2,3,4,0);
return 0;
}
sevencat 2003-10-15
  • 打赏
  • 举报
回复
就像我这样实现的。我再仔细一点
void CLog::log(char const *module,char const *fmt,...)
{
va_list args;
...
va_start(args,fmt);
vfprintf(eventstrm,fmt,args);
va_end(args);
...
}
就这样可以了,你还可以参照一下CString.format的写法。
CSharpP 2003-10-15
  • 打赏
  • 举报
回复
那C中的printf函数中的不是用了...表示可变参数列表吗?
他是怎么实现的呢?
sevencat 2003-10-15
  • 打赏
  • 举报
回复
#pragma once
#include <stdio.h>
#define EVENT_TIME_FORMAT "%b %d %H:%M:%S"
#define EVENT_TIME_MAXLEN 32

namespace util
{
class CLog
{
public:
FILE *eventstrm;

CLog(FILE* filestrm=stdout);
CLog(char const *filename);
~CLog(void);

void setlogfile(const char *filename);
//是不是像下面的这两个函数,有可变的参数列表?
void debug(char const *module,char const *fmt,...);
void log(char const *module,char const *fmt,...);
};
}

cpp文件
#include <string.h>
#include <stdarg.h>
#include <time.h>
#include "log.h"
namespace util
{
void CLog::debug(char const *module,char const *fmt,...)
{
#ifdef _DEBUG
va_list args;
char time_string[EVENT_TIME_MAXLEN];
struct tm * tmnow;
time_t now;
if (!eventstrm)
return;

/* get the time before parsing args */
time(&now);
if (!(tmnow = localtime(&now)))
strcpy(time_string,"?");
else
strftime(time_string,EVENT_TIME_MAXLEN,EVENT_TIME_FORMAT,tmnow);

if (!module)
{
fprintf(eventstrm,"%s [error] eventlog: got NULL module\n",time_string);
fflush(eventstrm);
return;
}

if (!fmt)
{
fprintf(eventstrm,"%s [error] eventlog: got NULL fmt\n",time_string);
fflush(eventstrm);
return;
}

fprintf(eventstrm,"%s %s(): ",time_string,module);
va_start(args,fmt);
vfprintf(eventstrm,fmt,args);
va_end(args);

fprintf(eventstrm,"\n");
fflush(eventstrm);
#endif
}

void CLog::log(char const *module,char const *fmt,...)
{
va_list args;
char time_string[EVENT_TIME_MAXLEN];
struct tm * tmnow;
time_t now;
if (!eventstrm)
return;

/* get the time before parsing args */
time(&now);
if (!(tmnow = localtime(&now)))
strcpy(time_string,"?");
else
strftime(time_string,EVENT_TIME_MAXLEN,EVENT_TIME_FORMAT,tmnow);

if (!module)
{
fprintf(eventstrm,"%s [error] eventlog: got NULL module\n",time_string);
fflush(eventstrm);
return;
}

if (!fmt)
{
fprintf(eventstrm,"%s [error] eventlog: got NULL fmt\n",time_string);
fflush(eventstrm);
return;
}

fprintf(eventstrm,"%s %s(): ",time_string,module);
va_start(args,fmt);
vfprintf(eventstrm,fmt,args);
va_end(args);

fprintf(eventstrm,"\n");
fflush(eventstrm);
}

CLog::CLog(FILE* filestrm)
:eventstrm(filestrm)
{
}

CLog::CLog(char const *filename)
{
eventstrm=stdout;
FILE *temp;
if(!filename)
return;
if(!(temp=fopen(filename,"a")))
return;
eventstrm=temp;
}

CLog::~CLog(void)
{
if(eventstrm)
fclose(eventstrm);
}

void CLog::setlogfile(const char *filename)
{
FILE *temp;
if(!filename)
return;
if(!(temp=fopen(filename,"a")))
return;
fclose(eventstrm);
eventstrm=temp;
}
}

使用
CLog glog;//这样是console的stdout输出
使用的时候直接在一个函数里面插入
glog.debug(__FUNCTION__,"hey, %d",i")这样就输出像下面的
sep 10 98 CServer::Run() : hey, 50
不过不知道你说的是不是这个东西。
summerxll 2003-10-15
  • 打赏
  • 举报
回复
主函数也可以带参数的吗!?什么时候要用到这样的方法!?
Wolf0403 2003-10-15
  • 打赏
  • 举报
回复
char * Func(void)
{
return "Func";
}
输出函数名,参数列表为空^_^
daizh 2003-10-15
  • 打赏
  • 举报
回复
这个不就是int main(int argc,char *argv[])的原理问题了。

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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