Aracılığıyla paylaş


va_arg va_end, va_start

Access bağımsız değişkeni listeler.

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)

Parametreler

  • type
    Alınacak bağımsız değişken türü.

  • arg_ptr
    Bağımsız değişkenler listesi için işaretçi.

  • prev_param
    İlk isteğe bağlı bağımsız değişkeni (yalnızca ANSI) önceki parametresi.

Dönüş Değeri

va_argGeçerli değişken döndürür; va_startve va_end sonuç değerleri olarak kullanılamaz.

Notlar

va_arg, va_end, Ve va_start makrolar taşınabilir işlev bağımsız değişken bir dizi alır, bir işlev bağımsız erişim olanağı sağlar.Makroları iki sürümü vardır: stdarg içinde tanımlı makrolar.H c ANSI standardına uyar.varargs içinde tanımlı makrolar.H eskidir ve geriye dönük uyumluluk için kalır.ANSI organizasyonu kullanılabilmesi için tasarlanmıştır.

Bu makrolar, işlev sabit sayıda isteğe bağlı bağımsız değişken bir dizi ardından gerekli bağımsız değişkenleri alır varsayalım.Gerekli bağımsız değişkenleri sıradan işleve parametre olarak bildirilir ve parametre adları yoluyla erişilir.İsteğe bağlı bağımsız değişkenler stdarg makrolar aracılığıyla erişilir.H veya varargs.İlk isteğe bağlı bağımsız değişken listesindeki bir işaretçi olarak, h, bağımsız değişkenleri listesinden almak ve bağımsız işlem tamamlandığında, işaretçiyi sıfırlayın.

stdarg içinde tanımlanan ANSI c standart makrolar.H, aþaðýdaki gibi kullanýlýr:

  • va_startayarlar arg_ptr ilk isteğe bağlı bağımsız değişkenleri listesinde işlevine geçirilen.Bağımsız değişken arg_ptr olmalıdır va_list türü.Bağımsız değişken prev_param ilk isteğe bağlı bağımsız değişken listesinde hemen öncesindeki gerekli parametre adı.prev_param Bildirildiği yazmaç depolama sınıfı ile makro davranışı tanımsız.va_startönce kullanılması gerektiğini va_arg ilk kez kullanılır.

  • va_argdeğeri alır type tarafından verilen konumdan arg_ptr ve aralıklarla arg_ptr sonraki bağımsız değişken listesinde boyutu kullanarak işaret etmek type sonraki bağımsız başladığı belirlemek için.va_argolabilir işlev içinde herhangi bir sayıda bağımsız değişken listesinden almak üzere kullanılır.

  • Tüm bağımsız değişkenler aldıktan sonra va_end işaretçisine sıfırlar null.

C++ notuC++ Notu

varargs içinde tanımlı makrolar.H kaldırılmıştır ve yalnızca geriye dönük uyumluluk mevcut.stdargs içinde tanımlanan makroları kullanın.H kodu ANSI standart önce çalıştığınız sürece.

İle derlendiğinde /CLR (ortak dil çalışma zamanı derleme), bu makroları kullanan programlar, doğal ve ortak dil çalışma zamanı tür sistemleri arasındaki farklılıklar nedeniyle beklenmeyen sonuçlar oluşturabilir.Bu programı göz önünde bulundurun:

#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*
}

Dikkat testit , ikinci parametre ya da olmasını bekler bir int veya char*.Geçirilen 0xffffffff değişkenlerdir (bir unsigned intdeğil, bir int) ve NULL (aslında bir intdeğil, bir char*).Yerel kodu derlendiğinde program çıkışı üretir.

-1
(null)

Ancak, ile derlendiğinde /clr:pure, bir özel durum oluşturmak program tür uyuşmazlıkları neden.Çözüm açık tonları kullanmaktır:

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

Gereksinimler

Başlık: <stdio.h> ve <stdarg.h>

Eski başlığı: <varargs.h>

Kitaplıkları

Tüm sürümleri c çalışma zamanı kitaplıkları.

Örnek

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

Çıktı

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

.NET Framework Eşdeğeri

System::ParamArrayAttribute sınıfı

Ayrıca bkz.

Başvuru

Bağımsız değişken erişim

vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l