为什么’;putchar是否需要标题?

为什么’;putchar是否需要标题?,c,C,阅读解释了在堆栈溢出上找不到的页面上的polyglot程序,我惊讶地阅读到使用了putchar,因为使用它不需要任何#include。这种情况似乎是这样的,尽管在stdio.h标题中定义了showputchar 在C中没有声明的情况下,如何(正确)使用函数?或者putchar是编译器内置的东西(比如sizeof运算符)?在中,您可以使用任何函数而无需声明 然后,编译器假定函数的返回类型为int。参数将按给定的方式传递给函数。由于没有函数声明,编译器无法验证参数是否正确 未内置到编译器中。 但是,

阅读解释了在堆栈溢出上找不到的页面上的polyglot程序,我惊讶地阅读到使用了
putchar,因为使用它不需要任何#include
。这种情况似乎是这样的,尽管在
stdio.h
标题中定义了show
putchar

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

在中,您可以使用任何函数而无需声明

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

未内置到编译器中。 但是,

函数调用putchar(c)应等同于putc(c,stdout)

它可以定义为宏,例如

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

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

某些编译器会执行一些奇怪的、非标准的操作,例如自动包含各种公共头。代码可能是在这样一个编译器上编译的

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

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

例如:

int main ()
{
  putchar('a');
}
它使用
gcc
以及
gcc-std=c90
编译。但是如果你把它编译成标准的C

gcc-std=c99-迂腐错误


您将得到
错误:函数“putchar”的隐式声明。

参数如何?编译器如何处理它们(在没有声明的函数调用上)?谢谢。最后一个问题:这对于 C++ +/Cuth>也是适用的吗?不,C++需要声明。如果没有函数声明,将出现编译错误。C要求函数原型可见。“隐式int”是15年前从C语言中删除的。所以这个答案已经过时了。正如@Lundin所写的,现在需要函数声明。C99基本原理:“C99中已删除隐式声明函数的规则。其效果是确保生成一个诊断,该诊断将捕获额外类别的编程错误。”设置适当的警告级别后,您应该会收到警告,然后使用未声明的函数。在gcc上使用
-Wall
。在Visual Studio中,在项目设置中打开警告级别4。对于所有其他编译器RTFM。