【问题标题】:Header inclusion not required for a .c program but for a .cpp program.c 程序不需要包含头文件,但 .cpp 程序需要包含头文件
【发布时间】:2017-08-10 07:46:01
【问题描述】:

我已经看到 .c 程序在不包含头文件的情况下执行良好,尽管它会引发警告,但是对于 .cpp 扩展名,不包含头文件会引发错误。有人能解释一下内部行为吗?

【问题讨论】:

  • 是的,C 和 C++ 是不同的语言。 (有不同的规则)
  • 也许,您正试图访问 C++ 中 std 命名空间的成员。您可能没有包含正确的标题,因此,您会收到如下错误:"foo" is not a member of 'std'
  • 您应该将因缺少头文件而导致的警告视为错误。
  • 事实上,使用没有原型的函数在 C 中也是无效的,但在 C99 之前,它还可以,所以编译器的行为是向后兼容的。
  • 重新阅读这个问题,我认为它不值得这么多反对。是的,您可以将其解读为“我希望 C 和 C++ 相同”,这很愚蠢。但是考虑到所描述的代码在两种语言中确实是一个错误,为什么许多 C 编译器接受它可能会引起一些人的兴趣。

标签: c++ c c-preprocessor


【解决方案1】:

简单回答:C 和 C++ 是不同的语言,具有不同的规则。

对于您的具体问题:在两种语言中使用没有原型的函数确实是非法。但是在 C 中,曾经有一段时间这是合法的(在 C99 之前),因此许多编译器仍然允许它,并在其默认操作模式下警告向后兼容。另一方面,这在 C++ 中是从不合法的,因此根本不可能找到接受此类代码的 C++ 编译器。

【讨论】:

  • 好的,但是在 gcc 中添加 -std=c99 也有同样的效果,一个警告然后正确执行。是的,你说得对,但是一个非常有趣的行为......
猜你喜欢
  • 2013-05-10
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
相关资源
最近更新 更多