2016-03-26 18 views
1

dies ist das eigentliche Makro:Variadische Makro erwartet ‚)‘ vor numerische Konstante

#ifdef DEBUG                 
#define debug(funcname, format, ...) \           
     printf(BOLD UNDERLINED REVERSE \          
     "DEBUG IN " __FILE__ \            
     " LINE " __LINE__ ":" \            
     RESET UNDERLINED REVERSE \           
     "In " funcname \             
     RESET REVERSE format RESET, ##__VA_ARGS__)       
#else                   
#define debug(funcname, format, ...)           
#endif                   

Wo alle die verwendete Konstante sind gut String-Konstanten definiert. Ich nenne es mit so etwas wie:

char message[] = "Hello StackOverflow !\n"; 
debug("main()", "Message: %s\n", message); 

Aber ich bekomme die Meldung

error: expected ‘)’ before numeric constant debug("main()", "Message: ", message); bei dem Abschluss parenthese poiting.

Es ist komisch, weil ich zum ersten Mal das Makro getestet, und jetzt, dass das Projekt mit dem Team vorangeschritten ist es nicht funktioniert ...

+0

nur um Ihnen zu helfen, der vordefinierte Name: '__func__' (beachten Sie Kleinbuchstaben) wird den Funktionsnamen zurückgeben, so müssen Sie nicht die Funktionsnamen in die Makroaufrufe fest codieren – user3629249

Antwort

5

Das ist, weil

" LINE " __LINE__ ":" 

der syntaktisch ungültig expandiert nach

" LINE " 42 ":" 

da __LINE__ eine ganze Zahl ist, nicht eine Stringliteral, die verkettet werden können.

+0

Danke Mann! Ich hätte darüber nachdenken sollen, aber Präprozessor-Fehlermeldungen können manchmal wirklich unverständlich sein. –

+0

@NicolasScottoDiPerto Sie können dies entweder mit '"% d "' im Format beheben und '__LINE__' vor dem' ## __ VA_ARGS__' verschieben; oder indem Sie die Erweiterung "__LINE__" stringyfizieren. – Jens