如何在vim中使用大量参数调试/重新格式化C printf调用?

时间:2010-05-14 16:51:10

标签: c vim

我在一个程序中有一个函数调用,我正在维护它有一个printf调用的28个参数。它在CSV文件中打印了大量数据。我找到了什么,我在参数类型中有一些不匹配的问题。我在gcc中启用了-Wall,我收到警告:

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 个答案:

答案 0 :(得分:5)

不确定我是否知道一个很好的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 )))));

答案 1 :(得分:3)

将格式字符串和调用拆分为多个fprintf调用

答案 2 :(得分:2)

根据警告,您知道有问题的参数号,例如15.在正常模式下:

  • 转到行首。
  • 输入'15f%'以在格式字符串中找到15.出现'%'。

答案 3 :(得分:1)

您可以将其拆分并仅保留一个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...);

你明白了,你仍然只有一次调用(这很重要,因为I / O通常比推动堆栈上的变量慢一个数量级),你可以安排你的变量,使它们按逻辑分组,更容易发现问题。