2009-10-04 12 views
13

Programım bir günlüğe ve stdout'a yazar. Bununla birlikte, her mesajın belirli bir önceliği vardır ve kullanıcı hangi önceliklerin hangi akışa (log veya stdout) gittiğini Tercihler bölümünde belirtir.Kullanıcı tercihlerine göre filtreler olan wrapper printf işlevi

unsigned short PRIO_HIGH = 0x0001; 
unsigned short PRIO_NORMAL = 0x0002; 
unsigned short PRIO_LOW = 0x0003; 

tercihleri ​​bazı bayrakları ile işlenir:

unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL); 
unsigned short PRIO_STD = (PRIO_HIGH); 

write_log fonksiyon unsigned short priority katma parametre ile printf işleviyle aynı parametrelerle birlikte çalışmalıdır. bayrakları Denetleme

write_log((PRIO_NORMAL|PRIO_LOW), "HELLO %s, take %d", "World", 1); 

(PRIO_NORMAL|PRIO_LOW biraz mantıklı bile ...)

kolaydır: (herhangi bir bayrak hem argüman olarak ayarlanırsa İade 1'e>) if(priority & PRIO_LOG)

Ben ancak bulamıyorum dize literal ve yazdırma biçimi işlevine biçim argümanlarını iletmek için nasıl giderim. Herkes bana bir işaretçi verebilir veya verebilir (aynı etkiyi gerçekleştiren alternatif bir yönteme mümkün)? Çok takdir edilecektir.

cevap

33

Sen, değişken argümanları fazla bilgi için

int write_log(int priority, const char *format, ...) 
{ 
    va_list args; 
    va_start(args, format); 

    if(priority & PRIO_LOG) 
      vprintf(format, args); 

    va_end(args); 
} 

C

ait " varargs" yeteneklerini kullanarak) (yerine printf) vprintf (call this çizgisinde bir şey görmek istiyorum.

+0

Visual C++ uygulamasında bunun yerine _____VA_ARGS_____ kullanabilirsiniz. Referans: http://msdn.microsoft.com/en-us/library/ms177415(v=vs.110).aspx –

+1

Lütfen görüntülemek için Düzenle '#include ' – robisrob

5

Bence Jeff'in fikri, ancak vprintf kullanmadan bir makro ile bunu başarmaktır. Bunun nasıl çalıştığı hakkında bilgi için

#define write_log(priority,format,args...)  \ 
        if (priority & PRIO_LOG) {  \ 
         printf(format, ## args); \ 
        } 

kontrol here: Bu gcc gerektirebilir. |

4
Eğer PRIO_ * tanımları bit olarak kullanılacak istiyorsanız (kullanarak ve &)

, bunların her birinin kendi bit vermelidir: Makro do kullanılarak geliştirilebilir

unsigned short PRIO_HIGH = 0x0001; 
unsigned short PRIO_NORMAL = 0x0002; 
unsigned short PRIO_LOW = 0x0004; 
{} while (0) notasyonu. Write_log çağrılarının daha çok bir ifade gibi hareket etmesini sağlar.

#define write_log(priority,format,args...) do { \ 
    if (priority & PRIO_LOG) { \ 
     printf(format, ## args); \ 
    } while(0) 
+0

Üzgünüm, Tür. Bunu kendi kaynağımda yaptım. işaret ettiğin için teşekkürler! Keskin bir göz için +1. – wsd