Bağımsız değişkenler listesinin sonuna işaretlemek istediğiniz değeri, argüman listesinden almak için yeterli olduğunu düşünüyorsanız, kullanabilirsiniz. Derleyici normalde, seçtiğiniz işlevin aslında işleve çağrıldığında iletildiğini kontrol etmeyecektir, bu yüzden ona dikkat etmeniz gerekir.
Esasen alışılmış şekilde bir değişkenlik işlevi yaratırsınız ve işlevin içinde, göndereninize uyan bir okuduğunuzda bağımsız değişkenleri okumayı durdurursunuz - özellikle yapılması gereken özel bir şey yoktur, ancak hangi türlerin gerektiğini bilmeniz gerekir. okunacak argümanlar. Örneğin
:
#include <stdarg.h>
/* Count arguments up to the number 5 */
int countArgsTilFive(int first, ...)
{
int res = 1;
va_list ap;
if (first == 5) return 0;
va_start(ap,first);
while (va_arg(ap,int) != 5) res++;
va_end(ap);
return res;
}
...
5
önce gerçekleşen tüm argumanlarini sayar. Yine de, listede bir yere
5
iletmezseniz veya
int
olmayan argümanları iletirseniz kötü şeyler olabilir.
bir sentinel lenf nodu son parametre olarak kullanarak, daha önce olduğu gibi geçirilir ve işaretçiler, bir diğer örnek: Bu
/* Count arguments, excluding the first, until the first occurs again */
int countPtrs(void *sentinel, ...)
{
int res = 0;
va_list ap;
va_start(ap,sentinel);
while (va_arg(ap,void *) != sentinel) res++;
va_end(ap);
return res;
}
Böyle bir işlev oluştururken, açıkça _can_ yapın. Argümanların keyfi varargs şemaları için doğru olduğunu kontrol etmek için herhangi bir GNU kapsamı bilmiyorum. Hatta bir parametrenin kaç argümanın verildiğini "saymak" için bir özniteliği bile yoktur, böylece derleyici doğru aldıklarını kontrol edebilir. –