У меня есть этот код:#define макрос не печатает переменную
#define PRINT(fmt, ...) printf("%s:%d: "fmt, __FILE__, __LINE__, ## __VA_ARGS__)
Это хорошо работает, когда я прохожу какое-то значение для него, например, PRINT("Hello, world").
Но когда я прохожу переменную в качестве аргумента, например. PRINT(somevar)
не печатает значение переменной int somevar
. Как переписать макросы, чтобы они также отображали переменные?
Вы имеете в виду, что мне лучше переписать его как обычную процедуру и использовать va_list? – cwenz1980
Макрос будет работать _not_, если аргумент 'fmt' (first) макроса не может быть конкатенирован с строкой' '% s:% d:" ', что означает, что он тоже должен быть литералом. Чтобы напечатать 'int somevar', вызов макроса должен быть' PRINT ("% d \ n", somevar); '. –
Короче говоря, вы не можете вызывать 'printf' как' printf (some_int_var) 'либо; необходима строка формата. Это ничем не отличается (и на самом деле является обязательным как const-literal, так как ваша логика теперь требует от него как concat-able, а вычисленная строка формата не представляется возможным, справедливое предупреждение). Единственное, что вы можете получить при отправке на это, - это как 'printf',' char * '(const или иначе) и точно так же, как' printf', который будет обескуражен по соображениям безопасности. – WhozCraig