Как отладить / переформатировать вызовы printf C с большим количеством аргументов в vim? - PullRequest
2 голосов
/ 14 мая 2010

У меня есть вызов функции в программе, которую я поддерживаю, имеет 28 аргументов для вызова printf. Он печатает много данных в файле CSV. У меня проблемы с поиском того, что происходит, и у меня есть некоторые несоответствия в типах параметров. Я включил -Wall в GCC, и я получаю предупреждения, такие как:

n.c:495: warning: int format, pointer arg (arg 15)
n.c:495: warning: format argument is not a pointer (arg 16)
n.c:495: warning: double format, pointer arg (arg 23)

Функция выглядит так:

fprintf (ConvFilePtr, "\"FORMAT3\"%s%04d%s%04d%s%s%s%d%s%c%s%d%c%s%s%s%s%s%s%s%11.lf%s%11.lf%s%11.lf%s%d\n", some_28_arguments_go_here);

Я хотел бы знать, есть ли плагин vim, который выделяет спецификатор формата printf, когда я перемещаю курсор над переменной.

Другие решения? Как лучше переформатировать код, чтобы сделать его более читабельным?

Ответы [ 4 ]

5 голосов
/ 14 мая 2010

Не уверен, что знаю хороший трюк vim с макушки головы, но я знаю хороший макрос C, чтобы сделать его немного легче:

#define last( f, a, ft, ... ) f ft, a, __VA_ARGS__
#define pair( f, a, ftat ) last( f, a, ftat )
// ...
printf( pair( "%s", "hello",
        pair( "%s", "world",
        pair( "%c", '\n',
        last( "%4x", 0xfeed,
              "%f\n", 3.14159 )))));
3 голосов
/ 14 мая 2010

разбить строку формата и вызов на несколько fprintf вызовов

2 голосов
/ 14 мая 2010

Из предупреждения вы знаете номер аргумента, например, 15. В обычном режиме:

  • Перейти к началу строки.
  • Введите «15f%», чтобы найти 15. вхождение «%» в строке формата.
1 голос
/ 14 мая 2010

Вы можете разделить его и сохранить только один fprintf звонок. Я часто делаю что-то подобное:

fprintf (ConvFilePtr,"\"FORMAT3"
                     "%s"
                     "%04d%s"
                     "%04d"
                     "%s%s%s"
                     "%d"
                     "%s%c"
                     "%s%d%d"
                     "%c%s"
                     "%s%s%s"
                     "%s%s"
                     "%s%11.lf"
                     "%s%11.lf"
                     "%s%11.lf"
                     "%s%d\n", str1,
                               int1, str2,
                               int2,
                               etc...);

Вы понимаете, у вас все еще есть только один вызов (что важно, поскольку операции ввода-вывода часто на порядок медленнее, чем помещение переменных в стек), и вы можете расположить переменные так, чтобы они группировались логически легче обнаружить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...