2010-01-13 18 views
22

Olası Çoğalt:
C Programming: Forward variable argument list.Başka bir varargs işlevine argüman listesi gönderen bir varargs işlevi yazmak mümkün mü?

Ne yapmak istiyorum yol printf tür bir günlük kütüphanesinden (ı modfify olamayacağını) veri göndermek olduğunu.

void log_DEBUG(const char* fmt, ...) { 
    char buff[SOME_PROPER_LENGTH]; 
    sprintf(buff, fmt, <varargs>); 
    log(DEBUG, buff); 
} 

Bazı tarzda başka vararg işlevine varargs uzatabilir:

Yani böyle bir fonksiyon şey istiyorum?

+1

Dupe: http://stackoverflow.com/questions/1719784/c-programming-forward-variable-argument-list –

cevap

25

Başka bir işleve parametre (ler) olarak ...'un altında ne olduğunu ifade etmenin bir yolu olmadığından değişken bağımsız değişken listesini iletemezsiniz.

Eğer ... parametrelerden bir va_list inşa etmek ve düzgün o kadar biçimlendirir bir işleve o gönderebilir Ancak. Bu vsprintf için nedir. Örnek:

void log_DEBUG(const char* fmt, ...) { 
    char buff[SOME_PROPER_LENGTH]; 
    va_list args; 
    va_start(args, fmt); 
    vsprintf(buff, fmt, args); 
    va_end(args); 
    log(DEBUG, buff); 
} 
+1

Unutmayın ** va_end ** –

+0

@Nikolai N Fetissov: Teşekkürler, düzeltildi. –

+3

Burada standart olmayan hiçbir şey görmüyorum. –

3

Standart C++ değil.

+0

sağ, C++, kullanımı tercih edilir '<< ' – ezpz

7

Bu nedenle, vprintf işlev ailesine sahipsiniz.

4

Özel gereksinimleriniz için vsprintf'u kullanabilirsiniz. Benim C/C++, diğer işlev bunun için tasarlanmadığında (çirkin yığın manipülasyonuna girmeden) yapmak için basit bir yol varsa, hatırlamak için çok paslıdır, ama düşünmeme eğilimindeyim.

13

Bunu bir argüman olarak argüman olarak alan başka bir işleve gönderebilirsiniz. Başka bir yol yok, el yapımı asm'a başvurmaktan ya da parametrelerin 'sayısını' belirlemek için bir çeşit dehşet verici tahmin oyunu yapmaktan başka çaresi yok.

Bu çalışacak:

void log_DEBUG(const char* fmt, ...) 
{ 
    va_list va; 
    va_start(va,fmt); 
    char buff[blah]; 
    vsprintf(buff,fmt,va); 
    log(DEBUG,buff); 
    va_end(va); 
} 

Temel olarak, alıyor ... bir işlev yazdıktan sonra, bir va_list alır başka bir sürümünü yazmalıdır - Bunu etkinleştirmek istiyorsanız onun kibar yapılacak şey zincirleme türü.

+0

Tam ihtiyacım olan şey. Belki de arg listesini doğrudan iletmek için bir yol var diye düşünüyordum, ama vsprintf güzel olacak! –

+0

kabul edilen cevap "vsprintf" noktasını kaçırdı, bu yüzden birçok kişi (bana) bu cevabı arayacak. – perfectionist

İlgili konular