2008-09-15 19 views

Odpowiedz

24

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.

-2

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.

+0

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' –

4

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.

+0

VC++ zjada przecinek końcowy, jeśli nie ma żadnych argumentów, czyż nie? –

0

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) 
0

Wyszukaj "VA_ARGS" i va_list w witrynie MSDN!

4

Jeśli nie chcesz korzystać z niestandardowych rozszerzeń, masz do zapewnienia dodatkowych wsporników:

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

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'. –

+0

#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

1

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.

1

Na MSVC 7.1 (.NET 2003), to działa:

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