在 C 编程中包含 ncurses.h 是否也包含 stdio.h?

Cup*_*ove 2 c ncurses stdio libraries

我正在研究 ncurses.h 因为我正在尝试学习一些 c 的设计方面,并且偶然发现了一个声明,说 stdio.h 在 ncurses 内部

  #include <ncurses.h>        /*ncurses.h includes stdio.h*/
Run Code Online (Sandbox Code Playgroud)

这是真的?如果是这样,有人可以向我解释原因,如果这意味着我不必再次包含它?

此外,这是否会导致任何问题,因为我没有在常规意义上对其进行准确定义

Kei*_*son 6

是的,包括<ncurses.h>几乎肯定会包括 <stdio.h>。但我建议不要利用这一点。

的文档ncurses确实说:

注意
头文件<curses.h>自动包含头文件<stdio.h>和<unctrl.h>.

(ncurses.h(通常?)是到 的符号链接curses.h。)

托马斯·迪基的主要维护者ncurses,告诉我们,这可以追溯到1994年,所以你极不可能遇到一个ncurses 不做到这一点的实现。

支持的 X/Open Curses 标准ncurses说(强调):

包含<curses.h> 可以使标题中的所有符号可见<stdio.h>,<term.h>,<termios.h>, 和<wchar.h>。

此外,在 中定义的一些函数<ncurses.h>和/或 <curses.h>接受类型FILE为 的参数,这些参数在中定义 <stdio.h>。(可以想象,有些东西可以在FILE 不包含的情况下使用该类型<stdio.h>,但这将是人为和愚蠢的,这种可能性不值得担心。)

所以#include <ncurses.h>在实际上保证包括 <stdio.h>。

说了这么多,我建议不要利用这个保证。如果您的 C 源文件依赖于 中声明的内容 <stdio.h>,那么就风格而言,您应该有一个明确的 #include <stdio.h>,即使它是严格冗余的。更一般地说,一个 C 源文件应该有一个#include指令,用于它所依赖的任何头文件。这是样式和可维护性的问题,而不是绝对要求。例如,请参阅 此问题。C 标准保证包含<stdio.h>不止一次不会导致问题。

  • 我完全同意依赖于任何标头的代码应该包含该标头——其中“代码”是指“C 源文件”,无论角色或文件扩展名如何。 (3认同)