2015-02-08 3 views
0

У меня есть этот код:#define макрос не печатает переменную

#define PRINT(fmt, ...) printf("%s:%d: "fmt, __FILE__, __LINE__, ## __VA_ARGS__) 

Это хорошо работает, когда я прохожу какое-то значение для него, например, PRINT("Hello, world"). Но когда я прохожу переменную в качестве аргумента, например. PRINT(somevar) не печатает значение переменной int somevar. Как переписать макросы, чтобы они также отображали переменные?

+0

Вы имеете в виду, что мне лучше переписать его как обычную процедуру и использовать va_list? – cwenz1980

+1

Макрос будет работать _not_, если аргумент 'fmt' (first) макроса не может быть конкатенирован с строкой' '% s:% d:" ', что означает, что он тоже должен быть литералом. Чтобы напечатать 'int somevar', вызов макроса должен быть' PRINT ("% d \ n", somevar); '. –

+0

Короче говоря, вы не можете вызывать 'printf' как' printf (some_int_var) 'либо; необходима строка формата. Это ничем не отличается (и на самом деле является обязательным как const-literal, так как ваша логика теперь требует от него как concat-able, а вычисленная строка формата не представляется возможным, справедливое предупреждение). Единственное, что вы можете получить при отправке на это, - это как 'printf',' char * '(const или иначе) и точно так же, как' printf', который будет обескуражен по соображениям безопасности. – WhozCraig

ответ

3

Проблема не в макросе. Это то, как вы его используете. По сути, ваше использование требует использования PRINT со строкой формата, которая должна быть строковым литералом, который описывает, что делать с последующими аргументами.

Например, попробуйте

PRINT("x = %d y = %d\n", x, y); 

где x и y являются переменными типа int.

+0

@ Джонатан Леффлер и Роб. Потрясающе !! Вы решили мою проблему в кратчайшие сроки! – cwenz1980

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