ncurses.h和curses.h头文件的区别

10
"

头文件 <ncurses.h><curses.h> 有什么不同,它们是 curses 库的变体吗?

"

为什么我应该选择

#include <ncurses.h>

而不是

#include <curses.h>


我搜索了一下我的Linux发行版的区别。在我的实现(Linux Ubuntu Pengolin)中,<ncurses.h><curses.h>头文件的别名文件。因此没有区别。

但是为什么会有两个不同的名称呢?


很遗憾,这个问题的答案(在使用ncurses库编译C时)-lcurses和-lncurses有什么区别?并没有解决我的疑虑,因为它们更注重于在调用编译器时添加相应的标志,而不是一般的差异。

3
curses.h 更具可移植性,而 ncurses.h 在所有系统上都不一定都可用。 - S.S. Anne
2
Curses是SystemV原始库的名称。 NCurses是该库的开源实现,具有相同的API。每个实现都会提供其特定的头文件,如ncurses.h、pcurses.h,并且它们将提供curses.h的符号链接到其特定的头文件,这样您就不必关心您使用的是哪种实现。 - MadKarel
如果您想要特定的curses库NCurses实现,并且您确定该实现将在目标计算机上可用,那么您可以使用ncurses.h。如果您只是想要一些curses API的实现,请使用curses.h,它可能由NCurses或库的其他实现来实现。 - MadKarel
1个回答

3
所有的X/Open Curses实现都提供了一个“curses.h”。ncurses通过符号链接提供其自己的实现“ncurses.h”,这样就可以选择该头文件,如果安装了另一个实现,例如在Solaris上。
如果您正在配置ncurses(构建它),则INSTALL文件在其中一个configure选项的上下文中对此进行了解释:
--disable-overwrite 如果您正在将ncurses安装到包含另一个版本的curses的系统上,或者可能因为加载器而混淆为另一个版本,则建议您省略对-lcurses的链接。ncurses库始终可用作-lncurses。 禁用overwrite还会导致ncurses头文件安装到子目录中,例如/usr/local/include/ncurses,而不是include目录。这使得更容易避免与其他版本的curses.h发生编译时冲突。
将头文件放入子目录中假定应用程序将按照(标准)惯例使用引用子目录名称包含标头。例如,通常的ncurses标头将使用以下方式包含:
#include <ncurses/curses.h> #include <ncurses/term.h>
而ncursesw头文件将以以下方式找到:
#include <ncursesw/curses.h> #include <ncursesw/term.h>
在任何情况下(带或不带--disable-overwrite选项),几乎所有应用程序都设计为从同一目录包含一组相关的curses头文件。
操纵--includedir configure选项以将头文件直接放入正常include目录的子目录中会破坏可移植应用程序的构建。同样,将某些标头放在/usr/include中,而将其他标头放在子目录中是破坏构建的好方法。
当使用--disable-overwrite配置时,安装的头文件的嵌入式#include将调整为使用上面提到的相同样式的包含。特别是,unctrl.h标头从curses.h中包括,这意味着告诉编译器直接从子目录中包含的makefile将无法正确编译。 如果没有一些特殊的努力,它要么根本无法编译,要么编译器可能会找到不同的unctrl.h文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接