Как я могу проверить достоверность вариативного аргумента __VA_ARGS__?

Я хотел определить макрос, например -

#define  log(lognumber,...)  logreport(lognumber,__VA_ARGS__) 

Я хотел проверить случай исключения для __VA_ARGS__ тех аргументов, которые пользователь может передать, когда этот пользователь вызывает log(). Пожалуйста, предоставьте мне случай исключения для __VA_ARGS__.


[обновление из комментария:]

Я имею в виду, что я хотел написать logreport таким образом, чтобы он печатал конкретный номер ошибки, которую я уже определил.

Взяв пример, например, если я прохожу

log(NOTE,"%s",str) 

то в этом случае он печатает определенные идентификаторы, которые я назначил в другом файле, подобном этому msgid %s, msdstr %s (10223), но пользователь использует

log(NOTE,"DIRECT STRING") 

он принимает [???] для этой строки. Итак, как мне проверить, что если пользователь передает аргумент таким образом

log(NOTE,"%s",str) 

or

log(NOTE,"direct string") 

таким образом в функции logreport?


person user2230832    schedule 14.05.2015    source источник
comment
Что вы подразумеваете под исключительным случаем? Чего именно вы пытаетесь достичь/защититься от?   -  person cnicutar    schedule 14.05.2015
comment
Просто напишите код в функции logreport, чтобы выполнить проверку, используя стандартные макросы va_start, va_arg и va_end для работы с переменными args. По крайней мере, это ответ на то, что, как я думаю, вы спрашиваете. Но ваш вопрос не очень ясен: случай исключения для __VA_ARGS__ - это не термин, который имеет смысл без объяснения того, что это значит.   -  person kaylum    schedule 14.05.2015
comment
Если я правильно это прочитал (а я не уверен), вас может заинтересовать stackoverflow.com/questions/2124339/   -  person Wintermute    schedule 14.05.2015
comment
Как и другие, не уверен, что именно вам нужно. Если вы хотите проверить соответствие форматов печати аргументам, вы не можете сделать это ни в функции, ни в макросе. Но некоторые компиляторы могут позволить вам выдавать предупреждения во время компиляции, например, gcc имеет format атрибут, который можно указать в функции logreport.   -  person M Oehm    schedule 14.05.2015
comment
Я имею в виду, что я хотел написать logreport таким образом, чтобы он печатал конкретный номер ошибки, которую я уже определил. Взяв пример, например, если я передаю журнал (ПРИМЕЧАНИЕ,% s, str), то в этом случае он печатает конкретные идентификаторы, которые я назначил в другом файле, таком как этот msgid %s, msdstr %s (10223), но пользователь использует журнал (ПРИМЕЧАНИЕ, ПРЯМАЯ СТРОКА). Он принимает для этой строки, так как я могу проверить это, если пользователь передача аргумента таким образом log(NOTE,%s,str) или log(NOTE,direct string) таким образом в функции logreport   -  person user2230832    schedule 14.05.2015


Ответы (1)


Итак, как мне проверить, что если пользователь передает аргумент

В настоящее время единственный способ — проанализировать второй аргумент на наличие некоторого спецификатора преобразования, такого как "%s".

person alk    schedule 16.05.2015