最近我一直在查看Steven Skiena的"Algorithm Design Manual"在线资源中的一些C示例代码,并且对他的一些函数调用的语法感到困惑。不可否认,自从C在大学工作以来已经有一段时间了,但我从来没有遇到像这样的无类型函数参数:
find_path(start,end,parents)
int start;
int end;
int parents[];
{
if ((start == end) || (end == -1))
printf("\n%d",start);
else {
find_path(starts,parents[end],parents);
printf(" %d",end);
}
}
这是有效的语法吗?这种功能声明是否有任何好处?它似乎比传统的内联类型参数更冗长。
答案 0 :(得分:6)
它们被称为K& R样式定义。不要在新代码中使用它们。甚至K和R也建议你在“The C Programming Language 2ed”中远离它们。
历史记录:ANSI C和更早版本之间的最大变化 版本是如何声明和定义函数。
参数在括号中命名,其类型为 在打开左支撑之前声明;未声明的参数是 被视为
int
。函数原型的新语法使a更容易 编译器检测参数或其类型的错误。 旧的声明和定义仍然适用于ANSI C,at 至少在过渡期内,但我们强烈建议您使用 当你有一个支持它的编译器时,新的表单。
答案 1 :(得分:2)
这是给出函数类型的旧式方式。它被放在C99 standard中,不适合现代代码。
答案 2 :(得分:1)
参数是键入的,只是不是内联的。类型位于第一行和左括号之间。
无论如何,这种风格很旧,不推荐使用。
答案 3 :(得分:0)
这些K& R定义是历史上定义函数的传统方式。在原始C中,这是定义函数的唯一方法。
不要再使用K& R定义了。为什么不?因为这样做会阻止编译器检查类型不匹配。
答案 4 :(得分:0)
这种古老的语法源于无类B programming language(正如其他人所说,不再是标准C中):
printn(n,b) {
extrn putchar;
auto a;
if(a=n/b) /* assignment, not test for equality */
printn(a, b); /* recursive */
putchar(n%b + '0');
}
顺便说一下,有些编译器可能会提供一个标志,让你可以编译这个旧式的K + R代码。