2013-09-23 26 views
6

staram się realizować funkcję makro w C, który poprzedza „DEBUG”, do argumentu, i przekazuje jej argumentów do printf:Błąd podczas definiowania stringising makro z __VA_ARGS__

#define DBG(format, ...) printf("DEBUG: " #format "\n", __VA_ARGS__) 

To daje mi ten błąd w gcc:

src/include/debug.h:4:70: error: expected expression before ‘)’ token 
#define DBG(format, ...) printf("DEBUG: " #format "\n", __VA_ARGS__) 
                   ^

Podobno powinno stringise format i przekazać swoje zmienne argumentów do printf, ale do tej pory nie mogę ominąć ten błąd.


EDIT

Po porzuceniu na stringising argumenty i dwukrotnie mieszania (##) __VA_ARGS__ Mam teraz ten błąd:

src/lib/cmdlineutils.c: In function ‘version’: 
src/lib/cmdlineutils.c:56:17: warning: ISO C99 requires rest arguments to be used [enabled by default] 
    DBG("version()"); 

powinienem być umieszczenie przecinka po argument?

DBG("version()",); // ? 

Dla porównania, DBG() wygląda teraz tak:

#define DBG(format, ...) printf("DEBUG: " format "\n", ##__VA_ARGS__) 
+0

działa na mnie na gcc, które kompilator nie używasz? Czy możesz spróbować wstawić spację między # i formatem? – Leeor

+0

$ gcc --version: gcc (GCC) 4.8.1 20130725 (prerelease) –

Odpowiedz

8

Dzieje chyba że istnieje co najmniej jedna zmienna argument. Można spróbować to rozszerzenie GNU go naprawić:

#define DBG(format, ...) printf("DEBUG: " #format "\n", ##__VA_ARGS__) 
                 ^^ 

Jak wyjaśniono in the GNU doc:

[if] the variable argument is left out when the macro is used, then the comma before the ‘##’ will be deleted.

+0

Niestety, to nie naprawiam tego dla mnie, zobacz edycję –

+0

@marcoms Całkiem dziwne, czy na pewno skopiowałeś poprawnie wiersz? – cnicutar

+0

jedyną postacią, której brakuje w mojej defenicji, jest hash ('#') przed 'formatem ', ponieważ zdecydowałem się na splafikowanie argumentu podczas jego wywoływania, aby wykluczyć jedną możliwą przyczynę, tj .:' DBG ("printf () ");' –

0

Check out this na MSDN. Zawiera informacje o makrach Variadic, których używasz.

0

Dlaczego musisz splajtować format, może on pozostać niezmieniony, traktując go jako ciąg podczas używania makra.

Błąd, jak cnicutar propsed można rozwiązać dodając '##' przed VA_ARGS

#define DBG(format, ...) printf("DEBUG: " format "\n", ##__VA_ARGS__) 

Przykład użycia:

DBG("%d - %s", a,b);