O ile mi wiadomo, w gcc można napisać coś takiego:Czy istnieje sposób na zapisywanie makr ze zmienną listą argumentów w wizualnym C++?
#define DBGPRINT(fmt...) printf(fmt);
Czy istnieje sposób, aby to zrobić w VC++?
O ile mi wiadomo, w gcc można napisać coś takiego:Czy istnieje sposób na zapisywanie makr ze zmienną listą argumentów w wizualnym C++?
#define DBGPRINT(fmt...) printf(fmt);
Czy istnieje sposób, aby to zrobić w VC++?
Tak ale tylko od VC++ 2005. Składnia Twój przykład będzie następujący:
#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)
Pełne odniesienie to here.
Prawie. To brzydsze niż że chociaż (i pewnie nie chce Kończący średnik w samej makro:
#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'
Aby go użyć:
DBGPRINT(("%s\n", "Hello World"));
(brakowało parę parens).
nie wiem, dlaczego wszystkie negatywy, oryginalne pytanie nie stwierdził wersji VC++ i zmiennej liczbie argumentów makra nie są obsługiwane przez wszystkie kompilatory.
Tak, można to zrobić w Visual Studio C++ w wersjach 2005 i późniejszych (nie jestem pewien co do VS 2003). Spójrz na VA_ARGS. Można w zasadzie zrobić coś takiego:
#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
oraz zmiennej argumenty makra będą przejdzie do funkcji przewidzianej jako „...” args, gdzie można następnie nam va_args analizować je.
Może występować dziwne zachowanie przy użyciu VA_ARGS i używania makr. Ponieważ VA_ARGS jest zmienna, co oznacza, że może zawierać 0 argumentów. To może zostawić cię z przecinkiem, gdzie nie masz zamiaru.
VC++ zjada przecinek końcowy, jeśli nie ma żadnych argumentów, czyż nie? –
Co szukasz nazywane są [o zmiennej liczbie argumentów makra] (http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)
Podsumowanie linku:.. Tak, z VC++ 2005 na górę
Poniższy powinien działać (patrz link Variadic macros.)
(Przykład poniżej pokazuje stałe i zmienne argumenty.)
# define DBGPRINTF(fmt,...) \
do { \
printf(fmt, __VA_ARGS__); \
} while(0)
Wyszukaj "VA_ARGS" i va_list w witrynie MSDN!
Jeśli nie chcesz korzystać z niestandardowych rozszerzeń, masz do zapewnienia dodatkowych wsporników:
#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
To jest takie złe, a jednak przegrał ... Chciałbym zwolnić kogoś za średnik na samym końcu definicji. Co zamierzałeś: '#define DBGPRINT (args) printf args' ... ale w tym przypadku wystarczy' #define DBGPRINT printf'. –
#define DBGPRINT printf nie będzie działał, jeśli chcesz usunąć cały kod wyjściowy debugowania z pliku wykonywalnego. Zostaniesz z wszystkimi listami parametrów (...), które wywołają co najmniej ostrzeżenia, mogą powodować błędy i nieoczekiwane efekty uboczne. – Tomek
Jeśli nie faktycznie potrzebują żadnej z cech makr (__FILE__
, __LINE__
, Reklamowe -pakowanie itp.) możesz rozważyć napisanie funkcji variadic za pomocą stdargs.h
. Zamiast wywoływać printf()
, funkcja variadic może wywoływać vprintf()
w celu przekazywania zmiennych list argumentów.
Na MSVC 7.1 (.NET 2003), to działa:
#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
Persumably się downvotes ponieważ były brakujące nawiasy oznaczało, że został złamany ... choć zadziwiająco, jeszcze bardziej zła wersja tego dostał się powyżej 5 przegranych. Wszyscy z was tęsknili za prostym '#define DBGPRINT printf' –