Aracılığıyla paylaş


Değişken Bağımsız Değişken Listeleriyle” İşlevler (C++)

Son bağımsız değişken olarak üç nokta (...) içeren işlev bildirimleri değişken sayıda bağımsız değişken alır. C++ yalnızca açıkça bildirilen bağımsız değişkenler için tür denetimi sağlar. İşlevin bağımsız değişken sayısı ve türleri farklılık gösterebiliyorsa değişken argüman listelerini kullanabilirsiniz. İşlev printf ailesi, değişken bağımsız değişken listelerine sahip işlevlere bir örnektir.

Değişken bağımsız değişkenleri olan işlevler

Bildirilenlerden sonra bağımsız değişkenlere erişmek için, bu makalede açıklandığı gibi standart ekleme dosyasında <stdarg.h> yer alan makroları kullanın.

Microsoft'a Özgü

Microsoft C++ üç noktanın son bağımsız değişken olması ve üç noktanın önüne virgül gelmesi durumunda üç noktanın bağımsız değişken olarak belirtilmesine olanak tanır. Bu nedenle, bildirim int Func( int i, ... ); yasaldır, ancak int Func( int i ... ); değildir.

END Microsoft'a Özgü

Değişken sayıda bağımsız değişken alan bir işlevin bildirimi, kullanılmasa bile en az bir yer tutucu bağımsız değişken gerektirir. Bu yer tutucu bağımsız değişkeni sağlanmazsa, kalan bağımsız değişkenlere erişmenin hiçbir yolu yoktur.

Türü char olan bağımsız değişkenler değişken bağımsız değişkenler olarak geçirildiğinde, türü int olacak şekilde dönüştürülür. Benzer şekilde, float türündeki bağımsız değişkenler değişken bağımsız değişken olarak geçirildiğinde, double türüne dönüştürülür. Diğer türlerin bağımsız değişkenleri normal integral ve kayan nokta yükseltmelerine tabidir. Daha fazla bilgi için bkz. Standart Dönüştürmeler.

Değişken listeleri gerektiren işlevler, bağımsız değişken listesindeki üç nokta (...) kullanılarak bildirilir. Bir değişken listesi tarafından geçirilen bağımsız değişkenlere erişmek için ekleme dosyasında açıklanan <stdarg.h> türleri ve makroları kullanın. Bu makrolar hakkında daha fazla bilgi için bkz . va_arg, va_copy, va_end, va_start.

Aşağıdaki örnekte, değişken bağımsız değişken listesini işlemek için makroların nasıl kullanılacağı gösterilmektedir:

// 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 );
}
32.400002
a
Test string

Yukarıdaki örnekte, bu önemli kavramlar gösterilmektedir:

  1. Değişken bağımsız değişkenlerine erişebilmek için önce va_list türünde bir değişken olarak bir liste işaretçisi oluşturmanız gerekir. Yukarıdaki örnekte, işaretleyici vl olarak adlandırılmıştır.
  2. Bağımsız değişkenlere va_arg makrosu kullanılarak erişilir. va_arg makrosuna, yığından doğru bayt sayısını aktarabilmesi için alınacak bağımsız değişkenin türünü bildirmeniz gerekir. va_arg için çağırma program tarafından sağlanandan farklı boyutta olan hatalı bir tür belirtirseniz, sonuçlar tahmin edilemez.
  3. Elde edilen sonucu va_arg makrosunu kullanarak istediğiniz türe açıkça atamanız gerekir.
  4. Değişken argüman işlemesini sonlandırmak için bir makro olan va_end çağırmanız gerekir.