2008-09-15 17 views

cevap

24

Evet ancak sadece bu yana VC++ 2005 sözdizimi için örneğiniz şöyle olurdu:

Tam referans here'dur.

-2

. O buna da daha çirkin (ve muhtemelen makro kendisinde bir sondaki virgül istemiyoruz:

#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')' 

kullanmak için:

DBGPRINT(("%s\n", "Hello World")); 

(Pars bir çift eksikti).

tüm negatifleri, orijinal soru VC++ bir sürümünü devlet yoktu ve variadic makrolar tüm derleyici tarafından desteklenmeyen neden emin.

+0

dikkat çekici, bunun daha da yanlış sürümü yukarıda var kadar olsa eksik parens ... kırık geliyordu çünkü Persumably downvotes vardı 5 upvotes. Hepiniz millet basit '#define DBGPRINT printf' özledim ' –

4

Evet, Visual Studio C yapabilirsiniz ++ sürümleri 2005 ve sonrası (VS 2003'ten emin değil). VA_ARGS'a bir göz atın.

#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__) 

ve makro değişken argümanlar sonra bize onları dışarı ayrıştırmak için va_args olabilir '...' args olarak sağlanan işleve geçirilen alacak: Temelde böyle bir şey yapabilirsiniz.

VA_ARGS ve makroların kullanımıyla ilgili garip davranışlar olabilir. VA_ARGS değişken olduğundan, 0 argüman olabileceği anlamına gelir. Bu, niyet etmediğin sondaki virgüllerle seni bırakabilir.

+0

VC++, argüman yoksa takip eden virgül yiyor, değil mi? –

0

çalışmalıdır aşağıdaki (Variadic macros linkine bakınız.)

(aşağıdaki Örnek sabit ve değişken bir bağımsız değişken gösterir.)

# define DBGPRINTF(fmt,...) \ 
    do { \ 
     printf(fmt, __VA_ARGS__); \ 
    } while(0) 
0

"VA_ARGS" için arama yapın ve va_list in MSDN! Aslında __FILE__, __LINE__, jeton makro özellikleri (herhangi gerekmiyorsa

#define DBGPRINT(args) printf(args); 
DBGPRINT(("%s\n", "Hello World")); 
4

, ekstra parantez sağlamak ettik -pşama, vb.) stdargs.h kullanarak değişken bir işlev yazmayı düşünebilirsiniz. printf()'u çağırmak yerine, değişken bir değişken listesi boyunca değişken bir işlev iletmek için vprintf()'u arayabilirsiniz.MSVC 7.1 için

+4

Bu çok yanlış, ama yine de oylar var ... Tek başına tanımlamanın sonunda birisini noktalı virgülle kovacağım. Ne amaçladınız: '#define DBGPRINT (args) printf args' ... ama bu durumda, sadece # DBFPRINT printf'de yazıyor. –

+0

#define DBGPRINT printf, tüm hata ayıklama çıkış kodlarınızı yürütülebilir dosyadan seçerseniz bunu yapmayacaktır. Tüm (...) parametre listelerinden ayrılacaksınız ve en azından uyarıları tetikleyecek, hatalara ve beklenmedik yan etkilere neden olabilir. – Tomek

1

: Eğer standart dışı uzantıları kullanmak istemiyorsanız

1

(.NET 2003), bu çalışır:

#if defined(DETAILED_DEBUG) 
#define DBGPRINT fprintf 
#else 
__forceinline void __DBGPRINT(...){} 
#define DBGPRINT __DBGPRINT 
#endif