C中的隐含声明

Pra*_*rav 4 c c99 undefined-behavior language-lawyer implicit-declaration

以下程序是否Undefined Behaviour在C中调用?

int main()
{
    printf("Printf asking: Where is my declaration ?");
}
Run Code Online (Sandbox Code Playgroud)

在上面的程序中有一个隐式声明printf(),上面的代码完全符合标准,还是只有一些特定于实现的行为?

dir*_*tly 7

是的,它确实.UB没有声明范围.

J.2未定义的行为

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

另外,请注意在C99中掉落main是正常的(即在语义上等同于a return 0;).对于符合C99前的编译器,您需要一个return语句,其中main函数的返回类型是兼容的类型int.

  • 请注意,该点适用的唯一原因是`printf`的参数列表以省略号结尾.它不适用于`puts`,因为参数类型是正确的. (5认同)
  • @PP:你的意思是'将值推到堆栈上"是一样的吗?还有依赖于实现的东西,比如调用约定来决定如何将参数传递给函数. (2认同)