Partilhar via


Funções com listas de argumentos variáveis

As funções que exigem listas de variáveis são declaradas usando as reticências (...) na lista de argumentos, conforme descrito em Listas de argumentos de variáveis. Use os tipos e as macros que são descritos no arquivo de inclusão STDARG.H para acessar os argumentos que são passados por uma lista de variáveis. Para obter mais informações sobre essas macros, consulte va_arg, va_end, va_start na documentação da biblioteca em tempo de execução C.

Exemplo

O exemplo a seguir mostra como as macros va_start, va_arg e va_end funcionam com o tipo va_list (declarado em STDARG.H):

// 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 variable 
//  list of arguments. Each argument corresponds to 
//  a format character in the format string to which 
// the szTypes parameter points 
void ShowVar( char *szTypes, ... ) {
   va_list vl;
   int i;

   //  szTypes is the last argument specified; you must access 
   //  all others 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 );
}
  

Comentários

O exemplo anterior ilustra estes conceitos importantes:

  • Você deve estabelecer um marcador de lista como uma variável de tipo va_list antes que argumentos de variáveis sejam acessados. No exemplo anterior, o marcador é chamado vl.

  • Os argumentos individuais são acessados usando a macro va_arg. Você deve informar à macro va_arg o tipo de argumento a ser recuperado para que ela possa transferir o número de bytes correto da pilha. Se você especificar um tipo incorreto de um tamanho diferente do fornecido pelo programa de chamada para va_arg, os resultados serão imprevisíveis.

  • É necessário converter explicitamente o resultado obtido usando a macro va_arg no tipo desejado.

  • Você deve chamar a macro va_end para encerrar o processamento de argumento de variáveis.

Consulte também

Referência

Definições de função C++