【发布时间】:2015-06-20 15:01:23
【问题描述】:
出于某种原因,-std=c99 阻止 gcc 看到函数 wborder_set() 的声明(位于 <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
它回复,
cursescurses.c: In function ‘main’:
cursescurses.c:18:7: warning: implicit declaration of function ‘wborder_set’ [-Wimplicit-function-declaration]
wborder_set( upperWin, "\u1234", "\u1234", "\u1234", "\u1234",
这让我相信我不能相信它正在正确链接 wborder_set。
为什么会这样?
【问题讨论】:
-
啊哈! “以下支持宽(多字节)字符的扩展 XSI 诅咒调用尚未实现:... wborder_set()...”因此,即使该函数在手册页中定义,它实际上并不存在。哦。
-
您必须先定义
_XOPEN_SOURCE_EXTENDED,然后才能包含任何标头以公开声明。 -
这是在 Linux 上吗?我发现在 Linux 上,像 -std=c99 这样的选项倾向于将头文件限制为最小 c99 模式,并禁用任何可能的扩展,例如各种 POSIX 功能。
-
我在 linux 上,是的。另外,我尝试定义
_XOPEN_SOURCE_EXTENDED,但没有帮助。