Chinaunix

标题: 请教:如何在c++中实现 vprintf的功能 [打印本页]

作者: wangrujun    时间: 2004-03-23 14:08
标题: 请教:如何在c++中实现 vprintf的功能
请教:

如果不用extern "C"的方法,如何在c++中实现 vprintf的功能

如果能有使用g++编译通过的例子就更好了。
在vc6中,因为vc6本身是一个完全对c进行工程妥协的工具,它对c的支持非常好,似乎是对于需要extern "C"的库,全部自动转换了。所以不存在这样的问题。msdn里面就有使用vprintf的例子。

但是如果用g++应该怎么办呢
作者: wjtmain    时间: 2004-03-23 20:13
标题: 请教:如何在c++中实现 vprintf的功能
试一试字符串流
头文件 sstream
std:stringstream str;
str<<整数<<字符<<字符串;

std::cout<<str.str()<<std::endl
可以流格式化
详细可以查一下相关资料,很好用,很方便
作者: lenovo    时间: 2004-03-23 20:27
标题: 请教:如何在c++中实现 vprintf的功能
你可以一样使用它呀。
作者: wangrujun    时间: 2004-03-24 09:42
标题: 请教:如何在c++中实现 vprintf的功能
查了一下资料,发现我说的问题不正确。

我实际上想问的是,c++中怎么样才能支持
funcion(arg1, arg2, ...)
这样的可变参数序列?

我写了这样一个程序,编译时出错。
作者: lenovo    时间: 2004-03-24 10:01
标题: 请教:如何在c++中实现 vprintf的功能
你就使用vprintf不行吗?
作者: wangrujun    时间: 2004-03-24 10:33
标题: 请教:如何在c++中实现 vprintf的功能
下面这段程序就无法编译。

这段程序是 Richard Stevens在apue中使用的通用日志处理程序。他使用可变长参数,来打印程序中的日志信息。

vprintf是可以直接使用的。但是无法实现可变长参数。


  1. // 与系统相关的非致命的错误信息
  2. void
  3. log_ret(const char *fmt, ...)
  4. {
  5.    va_list     ap;

  6.    va_start(ap, fmt);
  7.    log_doit(1, LOG_ERR, fmt, ap);
  8.    va_end(ap);

  9.    return;
  10. }

复制代码


  1. // 写日志信息
  2. static void
  3. log_doit(int errnoflag, int priority, const char *fmt, va_list ap)
  4.    // errnoflag: 为1:系统错误。 为0:非系统错误
  5.    // priority: 错误级别。syslog必须用。其它日志格式暂时不使用。
  6. {
  7.    static char sBuf[MAXLINE];
  8.    int   errno_save;

  9.    errno_save = errno;
  10.    vsprintf(sBuf, fmt, ap);

  11.    if (errnoflag)
  12.    {
  13.       sprintf(sBuf+strlen(sBuf), ": %s\n", strerror(errno_save));
  14.    }
  15.    else
  16.    {
  17.       strcat(sBuf, "\n");
  18.    }

  19.    fputs(sBuf, pfLog);
  20. }
复制代码

作者: wangrujun    时间: 2004-03-24 10:34
标题: 请教:如何在c++中实现 vprintf的功能
主要问题是
log_ret无法编译通过
作者: lenovo    时间: 2004-03-24 10:37
标题: 请教:如何在c++中实现 vprintf的功能
报什么错误,贴上来。
作者: wangrujun    时间: 2004-03-24 12:56
标题: 请教:如何在c++中实现 vprintf的功能
[quote]原帖由 "lenovo"]报什么错误,贴上来。[/quote 发表:


非常感谢lenovo版主耐心的看我的这个贴子。

现在问题已经解决。

原因如下:
我昨天使用的g++33,是200402xx版的。昨天晚上将它升级为20040308版。

因为没有精确的记录当时的环境,所以没有办法复现当时的结果。至少现在使用是完全正常的。

我另外一个关于g++33的问题,也是lenovo版主解决的。多谢您的帮助。
作者: wangrujun    时间: 2004-03-24 12:58
标题: 请教:如何在c++中实现 vprintf的功能
昨天如果把源码贴出来就好了。我觉得源码有些冗长,就没有这样做。但是这样不利于解决问题。以后会注意的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2