Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7653969
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 31, 20262026-05-31T12:09:38+00:00 2026-05-31T12:09:38+00:00

I was looking into some C++ source code files which perform some parsing when

  • 0

I was looking into some C++ source code files which perform some parsing when I came across
a rather curious looking function as shown below along with the Doxygen documentation.

My question is, in the arguments of the function ERROR what do the trailing dots (…)
mean? This is the first time I am seeing this being used.

/**
 * 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);
}

The gcc compiler which I use throws me the following warning (among others concerning other files)

parser_error.cpp: In constructor ‘Error::Error(int, int, int, ...)’:
parser_error.cpp:30: warning: second parameter of ‘va_start’ not last named argument
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-31T12:09:40+00:00Added an answer on May 31, 2026 at 12:09 pm

    That is a variable length argument list. From 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).
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I'm looking at some open source Java projects to get into Java and notice
I was looking into using some .NET code from within a Delphi program, I
I'm looking into some possible options for unit testing C++ classes. So, short and
I'm looking into some XSS prevention in my Java application. I currently have custom
I've been looking into some of the WYSIWYG editors (TinyMCE, FCKEditor, etc.) and they
I've been looking into some DHT systems, specially Pastry and Chord. I've read some
I'm looking into adding some unit tests for some classes in my data access
So I'm looking into writing some custom MVC extensions and the first one I'm
Looking for some direction here as I'm running into some migration problems. We have
Just some days ago I started looking into a unit test framework called check,

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.