【问题标题】:Implicit declaration in CC中的隐式声明
【发布时间】:2011-04-01 11:40:44
【问题描述】:

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

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

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

【问题讨论】:

  • 好吧,除了你不返回值的事实......
  • 在 C99 中,main() 中的显式 return 0 是可选的。编辑标签:-)

标签: c c99 undefined-behavior language-lawyer implicit-declaration


【解决方案1】:

是的。在范围内没有声明是 UB。

J.2 未定义行为

——用于调用不带 范围内的函数原型 函数是用函数定义的 原型,要么原型结束 带有省略号或类型 晋升后的争论不是 兼容的类型 参数(6.5.2.2)。

另外,请注意,在 C99 中,从 main 中脱离是可以的(即语义上等同于 return 0;)。对于 C99 之前兼容的编译器,您需要一个 return 语句,其中 main 函数的返回类型是与 int 兼容的类型。

【讨论】:

  • 请注意,该点适用的唯一原因是printf 的参数列表以省略号结尾。它不适用于puts,因为参数类型是正确的。
  • 请记住,省略号只会影响函数的实现。值以相同的方式压入堆栈——这被认为是 C 语言的便利之一——你可以将任何你想要的东西压入堆栈,但你将负责再次清理它。另一方面,Delphi 需要被调用的例程来清理堆栈。
  • @PP:“以相同的方式将值压入堆栈”是什么意思?有一些依赖于实现的东西,例如决定如何将参数传递给函数的调用约定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多