出于某种原因,-std = c99让gcc看不到函数声明wborder_set()(它位于Error: all(weight > 0) is not TRUE
)
<curses.h>
使用#include <curses.h>
#include <locale.h>
int main(int argc, char* argv[]){
initscr(); // start ncurses
cbreak(); // don't wait for lf to getch
noecho(); // don't copy entered characters
nonl(); // use /r/l
clear(); // clear the screen!
setlocale(LC_CTYPE, "");
int ySize, xSize;
getmaxyx(stdscr, ySize, xSize);
WINDOW *upperWin = newwin(ySize, xSize, 0, 0);
// magic utf encodings for window border
wborder_set( upperWin, "\u1234", "\u1234", "\u1234", "\u1234",
"\u1234", "\u1234", "\u1234", "\u1234" );
wrefresh(upperWin);
getch();
return 0;
}
进行编译工作正常!但是,如果我用
gcc test.c -lncursesw -o cursestest
它回复,
gcc test.c -std=c99 -lncursesw -o cursestest
这使我相信我无法相信它正确地连接了wborder_set。
为什么会发生这种情况?
答案 0 :(得分:1)
您的<curses.h>
似乎没有包含该功能的原型。 C99中的规则已更改:不再允许使用不带声明的函数。之前,他们将被假定返回int
。
这与链接无关,但这是一个关于编译器期望函数的某种返回类型的问题。
答案 1 :(得分:1)
定义_XOPEN_SOURCE_EXTENDED
会有所帮助,但Linux(与大多数系统一样)都存在与标准冲突的扩展形式的缺陷,以及对标准的不同解释。所以......对于Linux来说,通用的创可贴首先要定义_GNU_SOURCE
(它将适当的X / Open定义为事后的想法)。
如果您的ncurses配置包含reasonably current ncursesw5-config
脚本,则会添加-D
选项。
答案 2 :(得分:0)
事实证明问题是我包含了错误版本的<curses.h>
。函数wborder_set
实现了unicode,需要ncurses库的unicode / wide char扩展,我在#include <ncursesw/curses.h>
中包含了它。通过这种替换,程序按预期编译。