2016-03-26 2 views
1

это реальный макрос:VARIADIC макрос ожидается «)» перед числовой константы

#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                   

Где все константу хорошо определены строковые константы. Я называю это что-то вроде:

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

Но я получаю сообщение

error: expected ‘)’ before numeric constant debug("main()", "Message: ", message); Пойтинга на закрытии Parenthese.

Это странно, потому что я первый протестировал макрос, и теперь, когда проект продвинулся с командой он не работает ...

+0

как раз для того чтобы помочь вам, предопределенное имя: '__func__' (примечание в нижнем регистре) вернет имя функции, поэтому вам не нужно жестко указывать имена функций в вызовы макросов – user3629249

ответ

5

Это потому, что

" LINE " __LINE__ ":" 

расширяется синтаксический недействительным

" LINE " 42 ":" 

, поскольку __LINE__ представляет собой целое число, а не строка символов, которые могут быть объединены.

+0

Спасибо человеку! Я должен был подумать об этом, но сообщения об ошибках препроцессора могут быть иногда непонятными. –

+0

@NicolasScottoDiPerto Вы можете исправить это, используя ''% d ''в формате и перемещая' __LINE__' непосредственно перед '## __ VA_ARGS__'; или путем расширения расширения '__LINE__'. – Jens

Смежные вопросы