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

nal*_*zok 0 c stdio language-lawyer

例如,这里是一个"hello,world"程序,不stdio.h包括:

int puts(const char *str);

int main(void)
{
    puts("hello, world");
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ant*_*ala 6

C11标准草案的(非规范性)附录J.2在未定义行为的示例中列出了以下内容:

- 在声明或定义任何标头之前,使用指定为由某个标准头声明或定义的函数,对象,类型或宏(7.1.2)

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

2如果可以在不引用标头中定义的任何类型的情况下声明库函数,则允许声明该函数并使用它而不包括其关联的标头.

因此,puts不包括的使用<stdio.h>确实可以以符合标准的方式进行.但是,你不能声明fputs,因为它需要一个指针FILE作为参数,你不能以严格符合的方式做.

此外,puts也可能是存在的宏,<stdio.h>并在存在标题时扩展到更快的东西.

总而言之,可以在不包含头文件的情况下正确声明的函数数量并不大.至于使用标题中某些类型的函数 - 如果你问的是关于C的语言 - 律师标签,那么答案来自标准,标准对此非常坦率:不要这样做,否则你的程序会不是严格遵守,期限.

  • 但7.1.4p2是规范性的:"如果可以在不引用标题中定义的任何类型的情况下声明库函数,则允许声明该函数并使用它而不包括其关联的标题." (3认同)

Kei*_*son 5

<stdio.h>FILE除其他外,定义类型.您无法移植任何带FILE*参数的函数或FILE*没有返回结果的函数#include <stdio.h>.

并且没有充分的理由自己声明任何函数而不是包含标题.