在 C 中删除 #include <stdio.h> 是否正确?

Is it correct to drop #include <stdio.h> in C?

如果我在 C(不是 C++)中使用 printfscanfputs 或某些其他函数并且不编写包含行,是否可以将其视为未指定或未定义的行为?

我记得,C 根本不需要 porotope 声明,但建议让它们允许编译器在调用时进行类型转换。 printf 和其他此类函数的原型仍然不需要,不确定自定义函数。

PS:这个问题与https://codegolf.stackexchange.com/a/55989/32091.

评论中的讨论有关

对于职业发展,没有。

代码高尔夫,没问题。

如果您不声明一个函数,编译器会自动生成一个,它可能与它的真实声明相匹配,也可能不匹配。如果没有,它可能会或可能不会产生段错误或软件错误。 gcc 在这种情况下也会给出警告。

从技术上讲,在许多情况下您可以跳过 #include。但是对于某些函数,如果没有原型,编译器将无法生成正确的函数调用。例如。如果一个参数是 double 并且你把 0 - 使用原型,它将被转换并存储为堆栈中的 double 值,否则会有 int 会产生错误的计算.

stdio.h 有一个 explicit 函数声明,如果它是 C++ 编译器(例如 g++),则禁止这样的事情。 由于 c++ 需要所有函数的 explicit 声明,但是任何适当的 C compiler 都会创建这些函数的 implicit 声明,将代码编译成object文件,在和标准库链接的时候,会发现那些不小心会匹配隐式声明的函数的定义,可能gcc会给你一个警告。

因此,如果您正在编写希望可维护和可读的软件,那不是放弃它的选择,但是对于快速原型设计或代码挑战,这可能并不那么重要。

Is it correct to drop #include in C?

不,这不正确。如果您使用像 printf.

这样的 stdio.h 函数,请务必包含它

C 已删除隐式声明(使用 C99)并且需要包含。唯一的其他选择是为 printf.

提供一个可见的原型声明

此外,即使 C 有隐式声明,隐式声明也不适用于变量参数函数;所以在 C89 中不添加 stdio.h 包含并且没有可见的原型(对于 printf 示例)是未定义的行为。