例如,这是一个"你好,世界"没有包含stdio.h
的程序:
int puts(const char *str);
int main(void)
{
puts("hello, world");
}
我甚至认为,当我的程序越来越长时,这可能是一种很好的编程风格,因为所有被调用的函数都是明确列出的。
所以我的问题是:除了为标准库函数提供原型之外,#include <stdio.h>
还做了什么?
答案 0 :(得分:6)
C11标准草案的(非规范性)附录J.2列出了以下未定义行为的例子:
- 在声明或定义任何标头之前,使用指定为由某个标准头声明或定义的函数,对象,类型或宏(7.1.2)
然而,正如Keith Thompson指出的那样,7.1.4p2说:
2如果可以在不引用标题中定义的任何类型的情况下声明库函数,则允许声明该函数并使用它而不包括其关联的标题。
因此,在不包括puts
的情况下使用<stdio.h>
确实可以以符合标准的方式完成。但是,您不能声明fputs
,因为它需要指向FILE
的指针作为参数,而您无法以严格符合的方式执行此操作。
此外,puts
也可能是存在<stdio.h>
的宏,并且在标题出现时会更快地展开。
总而言之,可以在不包含标题的情况下正确声明的函数数量并不大。至于使用标题中的某些类型的函数 - 如果您使用 language-lawyer 标记询问C,答案来自标准,标准对此非常坦率:不要这样做,或者你的节目不会严格遵守,期限。
答案 1 :(得分:5)
<stdio.h>
定义了类型FILE
等。您无法轻松调用任何带有FILE*
参数的函数或在没有FILE*
的情况下返回#include <stdio.h>
结果。
并且没有充分的理由自己声明任何功能而不是包含标题。
答案 2 :(得分:1)
使用正确的程序设计时,所有公共函数原型都放在头文件中,所有函数定义都放在c文件中。这就是你编写C程序的时期。
它是C编程的行业事实上的标准方式,没有专业人士使用任何其他设计。
您的个人偏好与此无关,C标准中的任何环形孔也不允许您进行不同的设计。你应该用与世界其他地方相同的方式编写你的C程序。