如何将 K&R 函数声明自动转换为 ANSI 函数声明?

发布于 2024-12-14 07:09:37 字数 259 浏览 2 评论 0原文

// 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下有这么好用的工具吗?

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

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

As you see, in K&R style, the types of variables are declared in new lines instead of in the braces. How to convert a K&R function declaration to an ANSI function declaration automatically? Does anybody know such an easy-to-use tool in Linux?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

誰認得朕 2024-12-21 07:09:37

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

You can use cproto or protoize (part of GCC) to generate function prototypes or convert old style (K&R) functions to ANSI format.

走走停停 2024-12-21 07:09:37

我的 gcc 安装既没有 cproto 也没有 mkproto。但我确实有 Vim,并且我找到了一个全局替代品来一次执行一个参数...

:%s/^\(\%(\w\+\%(\s*\*\+\s*\|\s\+\)\)\+\)\(\w\+\)\s*(\@=\(.\{-}\)\([(,)]\)\s*\(\w\+\)\s*\([,)].*\)\n\s*\(.\{-}\)\5\([^;]*\);/\1\2\3\4\7\5\8\6/

其中记录的子表达式是:

  1. 函数返回类型
  2. 函数名称
  3. 已经原型化的参数(如果有)
  4. 下一个参数之前的分隔符要修复的 K&R 参数 - '(' 或 ','
  5. 下一个 K&R 参数要修复
  6. 以下分隔符 - ',' 或 ')',后跟任何剩余的(未处理的)K&R 参数标识符并以 ')' 结尾
  7. 参数的类型
  8. 参数的后标识符字符(例如方括号)

重复此操作,直到文件中不再有匹配项。请注意,该模式假定 K&R 函数声明位于一行上,后面是连续行上的各个参数声明。

该替代品的两个应用程序成功处理:

int main(argc,argv)
  int argc;
  char *argv[];
{
  printf("Hello world!\n");
  return 0;
}

进入:

int main(int argc,char *argv[])
{
  printf("Hello world!\n");
  return 0;
}

My gcc installation had neither cproto nor mkproto. But I did have Vim and I figured out a global substitute to do this one parameter at a time...

:%s/^\(\%(\w\+\%(\s*\*\+\s*\|\s\+\)\)\+\)\(\w\+\)\s*(\@=\(.\{-}\)\([(,)]\)\s*\(\w\+\)\s*\([,)].*\)\n\s*\(.\{-}\)\5\([^;]*\);/\1\2\3\4\7\5\8\6/

where the recorded subexpressions are:

  1. the function return type
  2. the function name
  3. the already-prototyped parameters (if any)
  4. the delimiter before the next K&R parameter to fix - '(' or ','
  5. the next K&R parameter to fix
  6. the following delimiter - ',' or ')' followed by any remaining (unprocessed) K&R parameter identifiers and closing ')'
  7. the parameter's type
  8. the parameter's post-identifier characters (e.g., brackets)

Repeat until no more matches in the file. Note, the pattern presumes the K&R function declaration is on one line, followed by individual parameter declarations on successive lines.

Two applications of this substitute successfully processes:

int main(argc,argv)
  int argc;
  char *argv[];
{
  printf("Hello world!\n");
  return 0;
}

into:

int main(int argc,char *argv[])
{
  printf("Hello world!\n");
  return 0;
}
薄荷港 2024-12-21 07:09:37

由于您想转换多行字符串,因此您应该考虑

拥有

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

并且必须拥有

void old_style( char c, int a) {}

Perl So

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'

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

的输出,那么解决正确的正则表达式会更容易。

diff file.c file.c.bkp

如果您尝试一下并在评论中发布每个源文件

Since You wanna convert a multiline string, you chould consider perl

you have

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

and must have

void old_style( char c, int a) {}

So

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'

or something like it, would do the trick.

It would be easier to tackle down the correct regex to this if you try it out and post in comments the output of

diff file.c file.c.bkp

for each of your source files.

半城柳色半声笛 2024-12-21 07:09:37
  1. 如果你想为 .h 文件创建标准 C 原型,请使用 mkproto.c

mkproto thisoldfile.c >这个旧文件.h

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


罗伯特的另一个答案 a> 在因“仅链接”答案而被删除之前包含以下(有用)信息:

您可以在以下位置找到 mkproto.c:

https://www.pcorner.com/list/C

那里还有很多其他实用程序。

该网站拥有两个版本的“mkproto”——1989-09-07 的 MKPROTO.ZIP 和 1992-06-27 的 MKPROTOB.ZIP。您必须在托管站点“程序员之角”注册才能下载文件。这些文件出现在可下载的长页面的大约 2/3 处。

  1. if you want to create standard C prototypes for a .h file use mkproto.c

mkproto thisoldfile.c > thisoldfile.h

You then could also paste over the old K&R code in the C file definition if desired.


Another answer by Robert contained the following (useful) information before it was deleted for being a 'link-only' answer:

You can find mkproto.c at:

https://www.pcorner.com/list/C

There are plenty of other utilities there.

The site hosts two versions of "mkproto" — MKPROTO.ZIP dated 1989-09-07 and MKPROTOB.ZIP dated 1992-06-27. You have to register with the host site, The Programmer's Corner, to download the files. The files appear about 2/3 of the way down a long page of possible downloads.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文