Bildiğim kadarıyla, gcc'de şöyle bir şey yazabilirsiniz:görsel C++ değişken argüman listesi ile makro yazmak için bir yolu var mı?
#define DBGPRINT(fmt...) printf(fmt);
Bunu VC++ içinde yapmanın bir yolu var mı?
Bildiğim kadarıyla, gcc'de şöyle bir şey yazabilirsiniz:görsel C++ değişken argüman listesi ile makro yazmak için bir yolu var mı?
#define DBGPRINT(fmt...) printf(fmt);
Bunu VC++ içinde yapmanın bir yolu var mı?
Evet ancak sadece bu yana VC++ 2005 sözdizimi için örneğiniz şöyle olurdu:
Tam referans here'dur.
. 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.
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.
VC++, argüman yoksa takip eden virgül yiyor, değil mi? –
denir Ne aradığınız [variadic makro] (http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)
bağlantının Özeti:.. Evet, VC++ 2005 den yukarı
ç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)
"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"));
, 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
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. –
#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
: Eğer standart dışı uzantıları kullanmak istemiyorsanız
(.NET 2003), bu çalışır:
#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
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 ' –