Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+;中函数参数列表中的尾随点(…)+; 我正在查看一些C++源代码文件,当我遇到这些代码文件时,会执行一些解析。 下面显示了一个外观相当奇特的函数以及Doxygen文档_C++ - Fatal编程技术网

C+;中函数参数列表中的尾随点(…)+; 我正在查看一些C++源代码文件,当我遇到这些代码文件时,会执行一些解析。 下面显示了一个外观相当奇特的函数以及Doxygen文档

C+;中函数参数列表中的尾随点(…)+; 我正在查看一些C++源代码文件,当我遇到这些代码文件时,会执行一些解析。 下面显示了一个外观相当奇特的函数以及Doxygen文档,c++,C++,我的问题是,在函数ERROR的参数中,尾随的点(…)是什么 意思是这是我第一次看到它被使用 /** * Create an error with given message id and fill in given string in message * @PARAM row row where the error occured (0 to neglect) * @PARAM col column where the error occured (0 to neglect) *

我的问题是,在函数ERROR的参数中,尾随的点(…)是什么 意思是这是我第一次看到它被使用

/**
 * Create an error with given message id and fill in given string in message
 * @PARAM row   row where the error occured (0 to neglect)
 * @PARAM col   column where the error occured (0 to neglect)
 * @PARAM id    id of the message
 * @PARAM arg   an argument which will be filled in in the message,
 *              replacing %s, %i, %f, %c
 */
Error::Error(const int row, const int col, const int id, ...)
: err_row(row), err_col(col), err_id(id)
{
    //sprintf(msg, msgdesc(id));
    const char* msg_desc = msgdesc(id);

    va_list args;
    va_start(args, msg_desc);
    vsnprintf(msg, sizeof(msg)-1, msg_desc, args);
    msg[sizeof(msg)-1] = '\0';
    va_end(args);
}
我使用的
gcc
编译器向我抛出以下警告(其中包括与其他文件有关的警告)


这是一个可变长度的参数列表。从man
stdarg

NAME
     stdarg -- variable argument lists

SYNOPSIS
     #include <stdarg.h>

     void
     va_start(va_list ap, last);

     type
     va_arg(va_list ap, type);

     void
     va_copy(va_list dest, va_list src);

     void
     va_end(va_list ap);

DESCRIPTION
     A function may be called with a varying number of arguments of varying types.  The include file <stdarg.h> declares a
     type (va_list) and defines three macros for stepping through a list of arguments whose number and types are not known to
     the called function.

     The called function must declare an object of type va_list which is used by the macros va_start(), va_arg(), va_copy(),
     and va_end().

     The va_start() macro must be called first, and it initializes ap, which can be passed to va_arg() for each argument to be
     processed.  Calling va_end() signals that there are no further arguments, and causes ap to be invalidated.  Note that
     each call to va_start() must be matched by a call to va_end(), from within the same function.

     The parameter last is the name of the last parameter before the variable argument list, i.e., the last parameter of which
     the calling function knows the type.

     Because the address of this parameter is used in the va_start() macro, it should not be declared as a register variable,
     or as a function or an array type.

     The va_arg() macro expands to an expression that has the type and value of the next argument in the call.  The parameter
     ap is the va_list ap initialized by va_start().  Each call to va_arg() modifies ap so that the next call returns the next
     argument.  The parameter type is a type name specified so that the type of a pointer to an object that has the specified
     type can be obtained simply by adding a * to type.

     If there is no next argument, or if type is not compatible with the type of the actual next argument (as promoted accord-
     ing to the default argument promotions), random errors will occur.

     The first use of the va_arg() macro after that of the va_start() macro returns the argument after last.  Successive invo-
     cations return the values of the remaining arguments.

     The va_copy() macro copies the state of the variable argument list, src, previously initialized by va_start(), to the
     variable argument list, dest, which must not have been previously initialized by va_start(), without an intervening call
     to va_end().  The state preserved in dest is equivalent to calling va_start() and va_arg() on dest in the same way as was
     used on src.  The copied variable argument list can subsequently be passed to va_arg(), and must finally be passed to
     va_end() when through with it.

     After a variable argument list is invalidated by va_end(), it can be reinitialized with va_start() or made a copy of
     another variable argument list with va_copy().

EXAMPLES
     The function foo takes a string of format characters and prints out the argument associated with each format character
     based on the type.

           void foo(char *fmt, ...)
           {
                   va_list ap, ap2;
                   int d;
                   char c, *s;

                   va_start(ap, fmt);
                   va_copy(ap2, ap);
                   while (*fmt)
                           switch(*fmt++) {
                           case 's':                       /* string */
                                   s = va_arg(ap, char *);
                                   printf("string %s\n", s);
                                   break;
                           case 'd':                       /* int */
                                   d = va_arg(ap, int);
                                   printf("int %d\n", d);
                                   break;
                           case 'c':                       /* char */
                                   /* Note: char is promoted to int. */
                                   c = va_arg(ap, int);
                                   printf("char %c\n", c);
                                   break;
                           }
                   va_end(ap);
                   ...
                   /* use ap2 to iterate over the arguments again */
                   ...
                   va_end(ap2);
           }

COMPATIBILITY
     These macros are not compatible with the historic macros they replace.  A backward compatible version can be found in the
     include file <varargs.h>.

STANDARDS
     The va_start(), va_arg(), va_copy(), and va_end() macros conform to ISO/IEC 9899:1999 (``ISO C99'').

BUGS
     Unlike the varargs macros, the stdarg macros do not permit programmers to code a function with no fixed arguments.  This
     problem generates work mainly when converting varargs code to stdarg code, but it also creates difficulties for variadic
     functions that wish to pass all of their arguments on to a function that takes a va_list argument, such as vfprintf(3).
名称
stdarg——变量参数列表
提要
#包括
无效的
va_开始(va_列表ap,最后);
类型
va_参数(va_列表ap,类型);
无效的
va_副本(va_列表目的地、va_列表src);
无效的
va_结束(va_列表ap);
描述
函数可以用不同类型的不同数量的参数调用。include文件声明了一个
类型(va_list)并定义三个宏,用于单步遍历参数列表,这些参数的数量和类型未知
调用的函数。
被调用函数必须声明一个va_list类型的对象,该对象由宏va_start()、va_arg()、va_copy()使用,
和va_end()。
必须首先调用va_start()宏,它初始化ap,可以将ap传递给va_arg(),以便每个参数都被调用
处理。调用va_end()表示没有其他参数,并导致ap无效。注意
在同一个函数中,对va_start()的每次调用必须与对va_end()的调用相匹配。
参数last是变量参数列表前最后一个参数的名称,即
调用函数知道类型。
由于此参数的地址在va_start()宏中使用,因此不应将其声明为寄存器变量,
或作为函数或数组类型。
va_arg()宏扩展为具有调用中下一个参数的类型和值的表达式。参数
ap是由va_start()初始化的va_列表ap。对va_arg()的每次调用都会修改ap,以便下一次调用返回下一次调用
论点参数类型是指定的类型名称,因此指向具有指定类型的对象的指针的类型
只需在类型中添加*即可获得类型。
若并没有下一个参数,或者类型和实际下一个参数的类型不兼容(如所示)-
如果不使用默认参数,将出现随机错误。
在va_start()宏之后第一次使用va_arg()宏将返回最后一次之后的参数。连续发票-
返回其余参数的值。
va_copy()宏将变量参数列表src的状态(以前由va_start()初始化)复制到
变量参数列表dest,在没有中间调用的情况下,它以前不能由va_start()初始化
到vau_end()。dest中保留的状态相当于以与以前相同的方式在dest上调用va_start()和va_arg()
用于src。复制的变量参数列表随后可以传递给va_arg(),最后必须传递给
完成时,请使用vau_end()。
变量参数列表被va_end()无效后,可以使用va_start()重新初始化它,或复制它
另一个带有va_copy()的变量参数列表。
例子
函数foo接受一个格式字符字符串,并打印出与每个格式字符关联的参数
基于类型。
无效foo(字符*fmt,…)
{
va_列表ap,ap2;
int d;
字符c,*s;
va_启动(ap、fmt);
副本(ap2,ap);
while(*fmt)
开关(*fmt++){
大小写's':/*字符串*/
s=va_arg(ap,char*);
printf(“字符串%s\n”,s);
打破
案例“d”:/*int*/
d=va_arg(ap,int);
printf(“int%d\n”,d);
打破
案例“c”:/*字符*/
/*注意:char被提升为int*/
c=va_arg(ap,int);
printf(“字符%c\n”,c);
打破
}
va_端(ap);
...
/*使用ap2再次迭代参数*/
...
va_端(ap2);
}
兼容性
这些宏与它们替换的历史宏不兼容。可以在中找到向后兼容的版本
包括文件。
标准
va_start()、va_arg()、va_copy()和va_end()宏符合ISO/IEC 9899:1999(`ISO C99')。
漏洞
与varargs宏不同,stdarg宏不允许程序员编写没有固定参数的函数。这
这个问题主要是在将varargs代码转换为stdarg代码时产生的,但它也给可变变量带来了困难
希望将其所有参数传递给接受va_列表参数的函数的函数,例如vfprintf(3)。

这是一个可变长度的参数列表。从man
stdarg

NAME
     stdarg -- variable argument lists

SYNOPSIS
     #include <stdarg.h>

     void
     va_start(va_list ap, last);

     type
     va_arg(va_list ap, type);

     void
     va_copy(va_list dest, va_list src);

     void
     va_end(va_list ap);

DESCRIPTION
     A function may be called with a varying number of arguments of varying types.  The include file <stdarg.h> declares a
     type (va_list) and defines three macros for stepping through a list of arguments whose number and types are not known to
     the called function.

     The called function must declare an object of type va_list which is used by the macros va_start(), va_arg(), va_copy(),
     and va_end().

     The va_start() macro must be called first, and it initializes ap, which can be passed to va_arg() for each argument to be
     processed.  Calling va_end() signals that there are no further arguments, and causes ap to be invalidated.  Note that
     each call to va_start() must be matched by a call to va_end(), from within the same function.

     The parameter last is the name of the last parameter before the variable argument list, i.e., the last parameter of which
     the calling function knows the type.

     Because the address of this parameter is used in the va_start() macro, it should not be declared as a register variable,
     or as a function or an array type.

     The va_arg() macro expands to an expression that has the type and value of the next argument in the call.  The parameter
     ap is the va_list ap initialized by va_start().  Each call to va_arg() modifies ap so that the next call returns the next
     argument.  The parameter type is a type name specified so that the type of a pointer to an object that has the specified
     type can be obtained simply by adding a * to type.

     If there is no next argument, or if type is not compatible with the type of the actual next argument (as promoted accord-
     ing to the default argument promotions), random errors will occur.

     The first use of the va_arg() macro after that of the va_start() macro returns the argument after last.  Successive invo-
     cations return the values of the remaining arguments.

     The va_copy() macro copies the state of the variable argument list, src, previously initialized by va_start(), to the
     variable argument list, dest, which must not have been previously initialized by va_start(), without an intervening call
     to va_end().  The state preserved in dest is equivalent to calling va_start() and va_arg() on dest in the same way as was
     used on src.  The copied variable argument list can subsequently be passed to va_arg(), and must finally be passed to
     va_end() when through with it.

     After a variable argument list is invalidated by va_end(), it can be reinitialized with va_start() or made a copy of
     another variable argument list with va_copy().

EXAMPLES
     The function foo takes a string of format characters and prints out the argument associated with each format character
     based on the type.

           void foo(char *fmt, ...)
           {
                   va_list ap, ap2;
                   int d;
                   char c, *s;

                   va_start(ap, fmt);
                   va_copy(ap2, ap);
                   while (*fmt)
                           switch(*fmt++) {
                           case 's':                       /* string */
                                   s = va_arg(ap, char *);
                                   printf("string %s\n", s);
                                   break;
                           case 'd':                       /* int */
                                   d = va_arg(ap, int);
                                   printf("int %d\n", d);
                                   break;
                           case 'c':                       /* char */
                                   /* Note: char is promoted to int. */
                                   c = va_arg(ap, int);
                                   printf("char %c\n", c);
                                   break;
                           }
                   va_end(ap);
                   ...
                   /* use ap2 to iterate over the arguments again */
                   ...
                   va_end(ap2);
           }

COMPATIBILITY
     These macros are not compatible with the historic macros they replace.  A backward compatible version can be found in the
     include file <varargs.h>.

STANDARDS
     The va_start(), va_arg(), va_copy(), and va_end() macros conform to ISO/IEC 9899:1999 (``ISO C99'').

BUGS
     Unlike the varargs macros, the stdarg macros do not permit programmers to code a function with no fixed arguments.  This
     problem generates work mainly when converting varargs code to stdarg code, but it also creates difficulties for variadic
     functions that wish to pass all of their arguments on to a function that takes a va_list argument, such as vfprintf(3).
名称
stdarg——变量参数列表
提要
#包括
无效的
va_开始(va_列表ap,最后);
类型
va_参数(va_列表ap,类型);
无效的
va_副本(va_列表目的地、va_列表src);
无效的
va_结束(va_列表ap);
描述
函数可以用不同类型的不同数量的参数调用。我