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

C 如何转换K&;自动将R函数声明转换为ANSI函数声明?,c,function,declaration,indentation,kr-c,C,Function,Declaration,Indentation,Kr C,如您所见,在K&R样式中,变量类型在新行中声明,而不是在大括号中声明。如何将K&R函数声明自动转换为ANSI函数声明?在Linux中有人知道这样一个简单易用的工具吗?< p>你可以使用或原型(GCC的一部分)来生成函数原型,或者将旧的(K&R)函数转换成ANSI格式。< /P> < P>因为要转换一个多行字符串,你应该考虑Perl 你有 // K&R syntax int foo(a, p) int a; char *p; { return 0; } // ANSI

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

< p>你可以使用或原型(GCC的一部分)来生成函数原型,或者将旧的(K&R)函数转换成ANSI格式。< /P> < P>因为要转换一个多行字符串,你应该考虑Perl

你有

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

// ANSI syntax
int foo(int a, char *p) 
{ 
    return 0; 
}
而且一定有

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

或者类似的东西,会起作用

如果您尝试使用正确的正则表达式并在输出中发布注释,那么将更容易解决这个问题

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'
对于每个源文件。

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

mkproto thisoldfile.c>thisoldfile.h


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

查看
indent
实用程序,但我认为这只会调整空格,并不完全是您想要的。protoize已经很久没有成为GCC的一部分了。我认为
cproto
现在是最好的选择。它并不完美;它有时会被Linux上系统头中的属性弄糊涂。但是,如果您生成头文件,而不是就地转换,它似乎可以正常工作。
protoize
代码已经多年没有成为GCC的一部分了。刚刚看到这个问题得到了回答,我想在我的一些旧代码中尝试cproto,并在这里分享结果!看起来很有希望。在哪里可以找到
mkproto.c
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