【问题标题】:Why doesn’t putchar require a header?为什么 putchar 不需要标题?
【发布时间】:2014-07-08 09:12:21
【问题描述】:

阅读 this answer,它解释了 Stack Overflow 上 page not found 上的多语言程序 我很惊讶地看到 putchar was used because you don't need any #include to use it。情况似乎如此,尽管en.cppreference.com referencewww.cplusplus.com reference 显示putchar,如stdio.h 标头中所定义。

如何在没有C 声明的情况下(正确地)使用函数?还是putchar 是编译器内置的东西(比如sizeof 运算符)?

【问题讨论】:

  • 设置了适当的警告级别后,您应该在使用未声明的函数后收到警告。在 gcc 上使用 -Wall。在 Visual Studio 中打开项目设置中的警告级别 4。对于所有其他编译器 RTFM。

标签: c


【解决方案1】:

中,您可以使用任何没有声明的函数。

然后编译器假定该函数的返回类型为 int。参数按给定的方式传递给函数。由于没有函数声明,编译器无法验证参数是否正确。

putchar 未内置在编译器中。 然而,由于

函数调用putchar(c)应该等价于putc(c,stdout)。

它可能被定义为一个宏,例如

#define putchar(c) putc(c, stdout)

在这种情况下,您必须包含stdio.h 才能获得putchar 的正确定义。

【讨论】:

  • 参数呢?编译器如何处理它们(在没有声明的函数调用上)?
  • 谢谢。最后一个问题:这也适用于C++
  • 不,对于 C++,需要声明。如果没有函数声明,则会出现编译错误。
  • C 要求函数原型可见。 15 年前,“隐式 int”从 C 语言中被删除。所以这个答案已经过时了。
  • 正如@Lundin 所写,现在需要函数声明。来自 C99 基本原理:“在 C99 中删除了隐式声明函数的规则。其效果是保证生成将捕获额外类别的编程错误的诊断。”
【解决方案2】:

一些编译器会做一些奇怪的、非标准的事情,例如自动包含各种常见的头文件。代码可能是在一个这样的编译器上编译的。

否则,在旧的过时 C90 标准中,您不需要使函数原型可见:如果没有,编译器将开始假定返回类型为 int。这没有任何意义。使用 C99 标准从 C 语言中删除了这种废话。

所以编译代码的原因是因为你使用了一个糟糕的编译器。无法保证代码将按预期编译/链接或工作。

例如:

int main ()
{
  putchar('a');
}

这与gcc 以及gcc -std=c90 一起编译。但是如果你把它编译成标准C,

gcc -std=c99 -pedantic-errors

你会得到error: implicit declaration of function 'putchar'.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2018-01-23
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多