编写原型而不是#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 程序。
例如,这里有一个 "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 程序。