编写原型而不是#include <stdio.h>

Writing prototypes instead of #include <stdio.h>

例如,这里有一个 "hello, world" 程序没有包含 stdio.h

int puts(const char *str);

int main(void)
{
    puts("hello, world");
}

我什至认为当我的程序越来越长时,这可能是一种很好的编程风格,因为所有调用的函数都明确地列在开头。

所以我的问题是:#include <stdio.h>除了为标准库函数提供原型外,还有什么作用?

C11 标准草案的 (non-normative) 附录 J.2 列出了以下未定义行为的示例:

— A function, object, type, or macro that is specified as being declared or defined by some standard header is used before any header that declares or defines it is included (7.1.2)

然而,正如 Keith Thompson 指出的那样,7.1.4p2 说:

2 Provided that a library function can be declared without reference to any type defined in a header, it is also permissible to declare the function and use it without including its associated header.

因此使用 puts 而不包含 <stdio.h> 确实可以以 standard-conforming 的方式完成。但是,您不能声明 fputs,因为它需要一个 pointer-to-FILE 作为参数,而您不能以严格一致的方式进行此操作。

此外,puts 也可能是存在 <stdio.h> 的宏,并且在存在 header 的情况下扩展为更快的东西。

总而言之,在不包含header的情况下可以正确声明的函数数量并不多。至于使用 headers 中某些类型的函数——如果你用 language-lawyer 标签询问关于 C 的问题,答案来自标准和standard 对此直言不讳:不要这样做,否则你的程序将不严格符合,期间。

<stdio.h> 定义类型 FILE 等。如果没有 #include <stdio.h>.

,则无法移植调用任何采用 FILE* 参数或 returns FILE* 结果的函数

确实没有充分的理由自己声明任何函数而不是包含 header。

当使用适当的程序设计时,public 函数的所有原型都放在头文件中,所有函数定义都放在 c 文件中。这就是你编写 C 程序的方式。

这是行业事实上的标准 C 编程方式,没有专业人员使用任何其他设计。

这里与您的个人喜好无关,也与 C 标准中的任何漏洞无关,可以让您进行不同的设计。您应该以与世界其他地方相同的方式编写您的 C 程序。