在C中调用没有原型的函数的任何文档?

时间:2011-03-08 07:00:20

标签: c visual-studio

似乎我可以在没有原型的情况下调用函数并在C中定义它,并且编译(没有链接)运行良好。如果函数在传递给link命令的其他模块中定义,则链接将起作用。但是调用站点会假设传递给它的每个参数都是int类型。是否有任何关于此标准或C标准的任何部分的文档提到了这种行为?

例如,可以在VC ++ 2010中编译下面的源文件而没有任何问题。

// NoPrototype.c
// Compile it as cl.exe /c NoPrototype.c
int main()
{
  FakeFunction(1, 2, 3); // No definition for this function in this compilation unit.
}

2 个答案:

答案 0 :(得分:1)

在范围内没有声明是UB。

  

J.2未定义的行为

     

- 对于在函数原型定义函数的范围内调用没有函数原型的函数,原型以省略号结束,或者促销后的参数类型与参数类型不兼容( 6.5.2.2)。

Comeau拒绝你的代码

"ComeauTest.c", line 5: error: identifier "FakeFunction" is undefined
    FakeFunction(1, 2, 3); // No definition for this function in this compilation unit.
    ^

1 error detected in the compilation of "ComeauTest.c"

答案 1 :(得分:1)

这就是它在旧的,预标准的C中工作的方式。在没有原型的情况下,函数返回int并获取int参数是(并且是在C99之前)。您有责任确保该函数在其他.c文件中的显示方式,包括实际获取每次调用中的参数数量。

这就是为什么像toupper这样的函数是int toupper(int c);而没有使用char的原因。它最初是在没有原型的情况下使用的,而且隐式接口卡住了!