Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- Değişken bağımsız değişkenlerine erişebilmek için önce
va_listtüründe bir değişken olarak bir liste işaretçisi oluşturmanız gerekir. Yukarıdaki örnekte, işaretleyicivlolarak adlandırılmıştır. - Bağımsız değişkenlere
va_argmakrosu kullanılarak erişilir.va_argmakrosuna, 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_argiçin çağırma program tarafından sağlanandan farklı boyutta olan hatalı bir tür belirtirseniz, sonuçlar tahmin edilemez. - Elde edilen sonucu
va_argmakrosunu kullanarak istediğiniz türe açıkça atamanız gerekir. - Değişken argüman işlemesini sonlandırmak için bir makro olan
va_endçağırmanız gerekir.