【问题标题】:How to convert a K&R function declaration to an ANSI function declaration automatically?如何将 K&R 函数声明自动转换为 ANSI 函数声明?
【发布时间】:2011-11-09 16:21:43
【问题描述】:
// K&R syntax
int foo(a, p) 
int a; 
char *p; 
{ 
    return 0; 
}

// ANSI syntax
int foo(int a, char *p) 
{ 
    return 0; 
}

如您所见,在 K&R 风格中,变量的类型是在新行中声明的,而不是在大括号中。如何将 K&R 函数声明自动转换为 ANSI 函数声明?有人知道 Linux 中有这么好用的工具吗?

【问题讨论】:

  • 查看indent 实用程序,但我认为这只会调整空格,并不完全是您想要的。

标签: c function declaration indentation kr-c


【解决方案1】:

您可以使用cproto 或 protoize(GCC 的一部分)来生成函数原型或将旧式 (K&R) 函数转换为 ANSI 格式。

【讨论】:

  • protoize 已经有一段时间没有成为 GCC 的一部分了。
  • 我认为cproto 现在是最好的选择。它并不完美;有时,它会被 Linux 上的系统头文件中的属性混淆。但是,如果您生成标题,而不是就地转换,它似乎可以正常工作。 protoize 代码多年来一直没有成为 GCC 的一部分。
【解决方案2】:

既然你想转换一个多行字符串,你应该考虑 perl

你有

void old_style( c , a ) char c; int a; { /* some multiline code */ }

而且必须有

void old_style( char c, int a) {}

所以

perl -i.bkp -nle 's/\((void|int|char|float|long) [a-zA-Z0-9_-]*\)([a-zA-Z0-9_-] ?,[a-zA-Z0-9_-] ?)\(.*{\)/\1(\2)/g'

或类似的东西,可以解决问题。

如果您尝试一下并在 cmets 中发布

的输出,则更容易解决正确的正则表达式
diff file.c file.c.bkp

为您的每个源文件。

【讨论】:

  • 刚刚看到这个问题得到了回答,我想在我的一些旧代码中尝试 cproto 并在这里分享结果!看起来很有希望。
【解决方案3】:

1) 如果您想为 .h 文件创建标准 C 原型,请使用 mkproto.c

mkproto thisoldfile.c > thisoldfile.h

如果需要,您还可以在 C 文件定义中粘贴旧的 K&R 代码。

【讨论】:

  • 在哪里找到mkproto.c
猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多