例如,这里有一个不包含stdio.h的“hello,world”程序:

int puts(const char *str);

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

我甚至认为当我的程序变得越来越长时,这可能是一种很好的编程风格,因为所有调用的函数都在开头显式列出。
所以我的问题是:除了为标准库函数提供原型之外,#include <stdio.h>还能做什么?

最佳答案

C11标准草案(非规范性)附录J.2列出了以下未定义行为的示例:
-在包含任何声明或定义函数、对象、类型或宏的头之前,使用由某个标准头声明或定义的函数、对象、类型或宏(7.1.2)
然而,正如Keith Thompson指出的,7.1.4p2表示:
2如果可以在不引用头中定义的任何类型的情况下声明库函数,则也允许声明函数并在不包含其关联头的情况下使用它。
因此,使用puts而不包括<stdio.h>确实可以以标准一致的方式完成。但是,您不能声明fputs,因为它需要一个指向-FILE的指针作为参数,而您不能以严格一致的方式这样做。
此外,puts也可能是存在于<stdio.h>的宏,并在存在头时扩展到更快的宏。
总之,在不包含头的情况下可以正确声明的函数的数量没有那么多。至于使用标题中某些类型的函数——如果你问关于C的语言律师标签,答案来自标准,标准对此相当直言不讳:不要这样做,否则你的程序将不会严格遵守,句号。

关于c - 编写原型(prototype)而不是#include <stdio.h>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36441910/

10-13 03:51