+ -
当前位置:首页 → 问答吧 → 参数里只有省略号参数该怎么获得参数列表

参数里只有省略号参数该怎么获得参数列表

时间:2011-11-28

来源:互联网

参数里只有省略号参数该怎么获得参数列表
int printc(...) 
{
}

如这样的,该怎么将参数都读出来呢,找了半天都是第一个参数是实参的。。。
这种形式下求解

作者: qnetg123   发布时间: 2011-11-28

搜va_list/va_start/va_end之类的用法。
给个简单例子:
C/C++ code

    int my_debug_printf(const char* str, ...)
    {
        int t = -1;

        //debug_begin();

        va_list list;

        va_start(list, str);

        t = vprintf(str, list);

        va_end(list);

        return t;
    }

作者: FrankHB1989   发布时间: 2011-11-28

FrankHB1989  
 我的问题你没明白清楚~~,只有省略号参数,不带其它

作者: qnetg123   发布时间: 2011-11-28

眼残,没看清LZ问题我自粽。。。

作者: FrankHB1989   发布时间: 2011-11-28

看看微软的例子

C/C++ code


// variable_argument_lists.cpp
#include <stdio.h>
#include <stdarg.h>

//  Declaration, but not definition, of ShowVar.
void ShowVar( char *szTypes, ... );
int main() {
   ShowVar( "fcsi", 32.4f, 'a', "Test string", 4 );
}

//  ShowVar takes a format string of the form
//   "ifcs", where each character specifies the
//   type of the argument in that position.
//
//  i = int
//  f = float
//  c = char
//  s = string (char *)
//
//  Following the format specification is a list
//  of n arguments, where n == strlen( szTypes ).
void ShowVar( char *szTypes, ... ) {
   va_list vl;
   int i;

   //  szTypes is the last argument specified; all
   //   others must be accessed using the variable-
   //   argument macros.
   va_start( vl, szTypes );

   // Step through the list.
   for( i = 0; szTypes[i] != '\0'; ++i ) {
      union Printable_t {
         int     i;
         float   f;
         char    c;
         char   *s;
      } Printable;

      switch( szTypes[i] ) {   // Type to expect.
         case 'i':
            Printable.i = va_arg( vl, int );
            printf_s( "%i\n", Printable.i );
         break;

         case 'f':
             Printable.f = va_arg( vl, double );
             printf_s( "%f\n", Printable.f );
         break;

         case 'c':
             Printable.c = va_arg( vl, char );
             printf_s( "%c\n", Printable.c );
         break;

         case 's':
             Printable.s = va_arg( vl, char * );
             printf_s( "%s\n", Printable.s );
         break;

         default:
         break;
      }
   }
   va_end( vl );
}



作者: skyworth98   发布时间: 2011-11-28

skyworth98 
 我不解释了~~~~~~~~~~~~~~~~

作者: qnetg123   发布时间: 2011-11-28

有高手帮解答下吗

作者: qnetg123   发布时间: 2011-11-28

求csdn高手帮我解答下

作者: qnetg123   发布时间: 2011-11-28

话说干嘛要(...)……
C++的int printc(...)类似于C的int printc(),就是传什么东西进去都没有形参接收,或者说,不关心你传什么东西进去……既然你要读参数,干嘛不用有前面有个参数的呢?

作者: FrankHB1989   发布时间: 2011-11-28

话说干嘛要(...)……
C++的int printc(...)类似于C的int printc(),就是传什么东西进去都没有形参接收,或者说,不关心你传什么东西进去……既然你要读参数,干嘛不用有前面有个参数的呢?

作者: FrankHB1989   发布时间: 2011-11-28

话说干嘛要(...)……
C++的int printc(...)类似于C的int printc(),就是传什么东西进去都没有形参接收,或者说,不关心你传什么东西进去……既然你要读参数,干嘛不用有前面有个参数的呢?

作者: FrankHB1989   发布时间: 2011-11-28

如果没有格式串是没办法解析的。

作者: pengzhixi   发布时间: 2011-11-28

唉,,,我要关心传进去是什么,但是参数中只有这些可变参数,
因为我要把这些代码转成TCL可用的dll,总不能让TCL那边还要去计算下有多少个参数再传吧。

作者: qnetg123   发布时间: 2011-11-28

刚才有看到说函数的参数指针,函数指针,返回值,这些指针都是连续的

好像是这样,

如果是这样,那可不可以通过函数指针 得到整个函数中参数的指针

作者: qnetg123   发布时间: 2011-11-28

你完全可以用一个int记录你传递的参数个数啊。比如void print(int count_parm,...);这个很麻烦吗?

作者: pengzhixi   发布时间: 2011-11-28

不麻烦,但是这样和我自己要求的不一样

作者: qnetg123   发布时间: 2011-11-28

你必须提供给函数一个参数个数信息,无论你是使用类似格式串,还是说直接用个int参数,否则你怎么确定传递参数个数。

作者: pengzhixi   发布时间: 2011-11-28