Sdílet prostřednictvím


va_arg, va_end, va_start

Seznamy přístupu proměnné argument.

type va_arg(
   va_list arg_ptr,
   type 
);
void va_end(
   va_list arg_ptr 
);
void va_start(
   va_list arg_ptr,
   prev_param 
); // (ANSI version)
void va_start(
   arg_ptr 
);  // (Pre-ANSI-standardization version)

Parametry

  • type
    Typ argumentu mají být načteny.

  • arg_ptr
    Ukazatel na seznam argumentů.

  • prev_param
    Parametr předcházející první nepovinný argument (pouze ANSI).

Vrácená hodnota

va_argVrátí aktuální argument; va_starta va_end nesmí vracet hodnoty.

Poznámky

va_arg, va_end, A va_start makra umožňují přenosné přístup argumenty funkce když funkce přijímá proměnný počet argumentů.K dispozici jsou dvě verze maker: makra definovaná v STDARG.H odpovídat standardu ANSI C.Makra definovaná v VARARGS.H jsou zastaralé a zůstat zpětné kompatibility.Byly navrženy pro použití před normalizaci ANSI.

Tato makra se předpokládá, že funkce přijímá pevný počet povinné argumenty, následuje proměnlivý počet nepovinných argumentů.Požadované argumenty jsou deklarovány jako běžné parametry funkce a lze přistupovat pomocí názvů parametrů.Volitelné argumenty jsou přístupné prostřednictvím makra v STDARG.H nebo VARARGS.H nastavit ukazatel na první nepovinný argument v seznamu argumentů, načtěte argumenty ze seznamu a obnovit ukazatel po dokončení zpracování argumentu.

Standardní makra ANSI C definované v STDARG.H, se použijí takto:

  • va_startNastaví arg_ptr první nepovinný argument v seznamu argumentů předaný funkci.Argument arg_ptr musí mít va_list typu.Argument prev_param je název povinný parametr bezprostředně předcházející první nepovinný argument v seznamu argumentů.Pokud prev_param je deklarována pomocí třídy úložiště rejstříku, chování makro není definováno.va_startmusí být použita před va_arg je poprvé použita.

  • va_argnačte hodnotu type z umístění dán arg_ptr a přírůstky arg_ptr přejděte na další argument v seznamu velikost pomocí type určit, kde začíná další argument.va_arglze použít libovolný počet v rámci funkce načtení ze seznamu argumentů.

  • Po načtení všech argumentů va_end nastaví ukazatel na NULL.

Poznámka k jazyku C++Poznámka k jazyku C++

Makra definovaná v VARARGS.H se již nepoužívá a existují výhradně pro zpětnou kompatibilitu.Pomocí makra definovaná v STDARGS.H Pokud nepracujete s kódem před ANSI standard.

Když kompilována s /CLR (kompilace společné Language Runtime), programy pomocí makra může způsobit neočekávané výsledky z důvodu rozdílů mezi systémy typu runtime nativní a společný jazyk.Zvažte tento program:

#include <stdio.h>
#include <stdarg.h>

void testit ( int i, ...)
{
   va_list argptr;
   va_start(argptr, i);

   if ( i == 0 ) {
      int n = va_arg( argptr, int );
      printf( "%d\n", n );
   } else {
      char *s = va_arg( argptr, char* );
      printf( "%s\n", s);
   }
}

int main()
{
   testit( 0, 0xFFFFFFFF ); // 1st problem: 0xffffffff is not an int
   testit( 1, NULL );       // 2nd problem: NULL is not a char*
}

Všimněte si, že testit očekává, že jeho druhý parametr je buď int nebo char*.Jsou předávány argumenty 0xffffffff ( unsigned int, není int) a NULL (skutečně k int, není char*).Při sestavit pro nativní kód, program vytvoří výstup

-1
(null)

Ale když kompilována s /clr:pure, neshody typu způsobit program generuje výjimku.Řešením je použít explicitní nádech:

int main()
{
   testit( 0, (int)0xFFFFFFFF ); // cast unsigned to int
   testit( 1, (char*)NULL );     // cast int to char*
}

Požadavky

Záhlaví: <stdio.h> a <stdarg.h>

Staré záhlaví: <varargs.h>

Knihovny

Všechny verze C Runtime knihovny.

Příklad

// crt_va.c
/* The program below illustrates passing a variable
 * number of arguments using the following macros:
 *      va_start            va_arg              va_end
 *      va_list
 */

#include <stdio.h>
#include <stdarg.h>
int average( int first, ... );

int main( void )
{
   /* Call with 3 integers (-1 is used as terminator). */
   printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );

   /* Call with 4 integers. */
   printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );

   /* Call with just -1 terminator. */
   printf( "Average is: %d\n", average( -1 ) );
}

/* Returns the average of a variable list of integers. */
int average( int first, ... )
{
   int count = 0, sum = 0, i = first;
   va_list marker;

   va_start( marker, first );     /* Initialize variable arguments. */
   while( i != -1 )
   {
      sum += i;
      count++;
      i = va_arg( marker, int);
   }
   va_end( marker );              /* Reset variable arguments.      */
   return( sum ? (sum / count) : 0 );
}

Výsledek

Average is: 3
Average is: 8
Average is: 0

Ekvivalent v rozhraní .NET Framework

Třída System::ParamArrayAttribute

Viz také

Referenční dokumentace

Argument Access

vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l