为什么’;putchar是否需要标题?
阅读解释了在堆栈溢出上找不到的页面上的polyglot程序,我惊讶地阅读到使用了为什么’;putchar是否需要标题?,c,C,阅读解释了在堆栈溢出上找不到的页面上的polyglot程序,我惊讶地阅读到使用了putchar,因为使用它不需要任何#include。这种情况似乎是这样的,尽管在stdio.h标题中定义了showputchar 在C中没有声明的情况下,如何(正确)使用函数?或者putchar是编译器内置的东西(比如sizeof运算符)?在中,您可以使用任何函数而无需声明 然后,编译器假定函数的返回类型为int。参数将按给定的方式传递给函数。由于没有函数声明,编译器无法验证参数是否正确 未内置到编译器中。 但是,
putchar,因为使用它不需要任何#include
。这种情况似乎是这样的,尽管在stdio.h
标题中定义了showputchar
在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”的隐式声明。
参数如何?编译器如何处理它们(在没有声明的函数调用上)?谢谢。最后一个问题:这对于-Wall
。在Visual Studio中,在项目设置中打开警告级别4。对于所有其他编译器RTFM。