Как упоминалось ранее @RustyX printf
проверка формата теперь поддерживается по умолчанию с VC2015 . То есть без a /analyze
прохода статического анализа. К сожалению, пока нет механизма для маркировки пользовательских функций-оболочек.
Это предполагает очевидный обходной путь вызова printf . Это определение макроса, который вызывает как пользовательскую функцию, так и сам printf
. Последний на мертвом пути должен быть оптимизирован.
Это дает дополнительное преимущество в достижении некоторого уровня переносимости для других компиляторов.
int printf_wrapper_(const char *format, ...);
#define printf_wrapper(...) \
(printf || printf(__VA_ARGS__), printf_wrapper_(__VA_ARGS__))
Недостатком является то, что VC2015 выполняет некоторое элементарное удаление мертвого кода до проверки формата, проверяя только оставшийся живой код.
Таким образом sizeof
или константные условные выражения потерпят неудачу. Как правило, если отладочная сборка выдает код времени выполнения, вы получите предупреждение, хотя более поздние передачи в сборках выпуска могут по-прежнему завершать вызов.
Увы, из-за этого движущаяся цель может измениться в будущих версиях компилятора. Хоть и относительно мягкий.