【问题标题】:Condense multiline C function prototypes压缩多行 C 函数原型
【发布时间】:2011-07-25 21:39:25
【问题描述】:

我有 C 函数原型(某些 windows api 头文件),看起来像:

int
foo
(
int
a
,
int
*
b
)
;

(他们似乎没有编码约定)

我试图以编程方式将其转换为表单的单行原型(或接近它的东西):

int foo(int a, int * b);

我已经研究过 ctags (ctags multi-line C function prototypes) 之类的程序以及 uncrustify (http://uncrustify.sourceforge.net/) 中的各种设置,但是我都无法取得任何进展。 (任何见解都会很棒,或者也许我错过的 385 个不可信选项之一可以满足我的需求)。

以编程方式,我正在尝试寻找表示函数原型的唯一标记,以便我可以编写一个脚本来根据自己的喜好格式化代码。

如果不使用词法分析器和解析器,这似乎很快就会变得非常复杂;有什么建议吗?

【问题讨论】:

  • 原始格式从何而来?
  • @carl 这些文件是windows api头文件,虽然大多数都没有例子那么夸张,但我正在努力寻找一个尽可能健壮的解决方案

标签: c ctags exuberant-ctags uncrustify


【解决方案1】:

通过indent -krastyle --style=kr 运行它们

【讨论】:

  • indent -kr 几乎正是我要找的,唯一不能解决的是将指针指向同一行
  • astyle --style=kr 似乎被贬低了,(astyle.sourceforge.net/notes.html)所以我使用了--style=k/r。但是它只是缩进,没有换行。
  • 更好的是,man indent 先看看你最喜欢哪些选项 :)
  • indent -kr 不起作用,因为它不会将( 移动到与foo 相同的行。
【解决方案2】:

使用vim的解决方案?

将标记放在 int 上并执行 11J

【讨论】:

  • 返回其他类型的函数的原型呢?
【解决方案3】:
sed ':a;N;$!ba;s/\n/ /g' prototypes.file  | sed 's/; */;\n/g'

第一个命令 - 在管道之前 - 将所有换行符替换为空格,下一个命令将在每个分号后放一个换行符。

当然,这只有在文件中除了这些原型之外什么都没有的情况下才有效。如果还有一些其他的东西你想保持原样,你可以使用 vim 的视觉选择和两个替换命令:

选择你想加入的地区,然后

:s/\n/ /

选择连接线并

:s/; */;\r/g

【讨论】:

    【解决方案4】:

    使用vi的另一种解决方案:

    进行正则表达式搜索,删除所有换行符。然后把结果弄得一团糟,做另一个正则表达式搜索,用; \n\n替换每个;。这应该会给你留下一个原型列表,每个原型之间都跳过一行。由于我们标记原型的结尾而不是开头,并且所有原型都以相同的方式结束,因此我们不必担心无法识别特殊情况。

    【讨论】:

    • 我之前尝试过这个,不记得为什么我停止了 - 我会回头看看
    • 我猜你需要从倾斜牙签综合症中恢复过来。好吧,回到它。 :)
    猜你喜欢
    • 2018-08-13
    • 2012-01-20
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多