2016-05-12 4 views
6

Когда C printf() и его семейство скомпилировано gcc и -Wall используется в командной строке, компилятор предупреждает об ошибочных аргументах в соответствии с используемой строкой формата. В качестве примера приведенный ниже код получит сообщение об ошибке, указывающее, что формат указан 3 аргументами, но на самом деле вы только передали два.printf() аргументы обертки, которые будут проверяться gcc

printf("%d%d%d", 1, 2); 

При написании оболочки к printf(), как вы держите эту возможность? Я бы мог подумать о форме функции или макросе. Но простые парсеры могут быть приемлемыми.

Несколько способов написания оболочки printf можно найти в stackoverflow. Два общих подхода: using vprintf with varargs и using __builtin_apply. Я пробовал эти два подхода, никто не работал.

ответ

3

Вы можете использовать атрибут функции gcc , чтобы проверить параметры на строку формата.

extern int my_printf (void *my_object, const char *my_format, ...) 
      __attribute__ ((format (printf, 2, 3))); 

Проверьте НКУ руководство "6.31.1 Common Function Attributes"

+0

удивительным! он отлично работает! – minghua

+1

примечание, если 'my_printf' является членом класса: добавьте 1 к нумерации аргументов. это будет '__attribute__ ((format (printf, 3, 4)));' – minghua