4

以下程序是否在C中调用Undefined BehaviourC中的隐式声明

int main() 
{ 
    printf("Printf asking: Where is my declaration ?"); 
} 

在上述程序中存在的printf()一个隐含的声明,所以上面的代码完全符合标准,或者只是有一些实施的具体行为?

+0

那么,除了你没有返回值的事实... – 2010-08-20 04:21:30

+2

在C99中,'main()'中显式的'return 0'是可选的。编辑标签:-) – 2010-08-20 04:22:14

回答

7

是的。 UB没有范围声明。

J.2未定义行为

- 对于调用的函数而不范围 函数原型其中 函数与一个函数 原型限定,无论是原型结束 以省略号或者促销后的参数类型不是 与参数(6.5.2.2)的 类型兼容。

另外,请注意,在C99中脱落的主体是可以的(即在语义上等同于return 0;)。对于符合C99标准的编译器,您需要返回语句,其中主函数的返回类型是与int兼容的类型。

+0

感谢J.2,AC :) – 2010-08-20 04:31:02

+5

请注意,该点适用的唯一原因是'printf'的参数列表以省略号结尾。它不适用于'puts',因为参数类型是正确的。 – 2010-08-20 04:32:47

+0

请记住,省略号仅影响函数的实现。值被以同样的方式推入堆栈 - 这被认为是C的便利之一 - 你可以在堆栈中推送任何你想要的东西,但是然后你会负责再次清理它。另一方面,Delphi需要被调用的例程来清理堆栈。 – 2010-08-20 05:38:32