我只在使用-std = c99时才收到隐式声明错误

时间:2015-06-20 15:01:23

标签: c gcc c99 ncurses

出于某种原因,-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。

为什么会发生这种情况?

3 个答案:

答案 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>中包含了它。通过这种替换,程序按预期编译。