Это комбинация двух специальных правил, описанных в документации -Wformat
.
Функция printf
встроена в , что позволяет GCCи для оптимизации, и для предупреждения о неправильном использовании.Что касается конкретного случая printf
, в документации есть примечание :
Кроме того, когда функция распознается как встроенная функция, GCC может использовать информациюоб этой функции, чтобы предупредить о проблемах с вызовами этой функции или сгенерировать более эффективный код, даже если полученный код все еще содержит вызовы этой функции.Например, предупреждения выдаются с -Wformat
для неправильных вызовов на printf
, когда встроен printf
и известно, что strlen
не изменяет глобальную память.
Кроме того, вы можетеобъявляйте ваши собственные функции как printf-подобные для целей предупреждения с атрибутом format
.
__attribute__((__format__(__printf__, 2, 3))) /*printf-like function, the format string is parameter 2, the first element is parameter 3*/
int myprintf(int stuff, const char *format, ...);
С помощью встроенной функции GCC пытается заменить вызов функции чем-то болееэффективный.Для printf
это обычно означает, что когда аргумент формата является строковым литералом, GCC заменяет его серией вызовов для печати отдельных элементов.Например, он может скомпилировать printf("%d %s\n", x, s);
, как если бы программа содержала __some_internal_function_to_print_a_dcimal_integer__(x); putc(' '); puts(s);
.Пока компилятор выполняет эту оптимизацию, он заметит любое несоответствие между строкой формата и типами аргументов и предупредит соответственно.Если функция не встроена, но имеет атрибут format
, вы просто получите предупреждения.