似乎我可以在没有原型的情况下调用函数并在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.
}
答案 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
的原因。它最初是在没有原型的情况下使用的,而且隐式接口卡住了!