C函数声明中的无类型参数

时间:2011-07-14 11:33:43

标签: c function syntax types arguments

最近我一直在查看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);
    }
}

这是有效的语法吗?这种功能声明是否有任何好处?它似乎比传统的内联类型参数更冗长。

5 个答案:

答案 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代码。