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

时间:2016-04-06 05:01:31

标签: c language-lawyer stdio

例如,这是一个&#34;你好,世界&#34;没有包含stdio.h的程序:

int puts(const char *str);

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

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

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

3 个答案:

答案 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程序。