仅在使用 -std=c99 时出现隐式声明错误
I'm getting an implicit declaration error only when using -std=c99
出于某种原因,-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。
为什么会这样?
您的 <curses.h>
似乎没有包含该函数的原型。 C99 中的规则发生了变化:不再允许使用没有声明的函数。以前,他们会被假定为 return int
.
这与链接无关,但这是一个关于编译器期望函数具有特定 return 类型的问题。
定义 _XOPEN_SOURCE_EXTENDED
会有所帮助,但 Linux(与大多数系统一样)存在与标准冲突的扩展形式的缺陷,以及对标准的不同解释。所以...对于 Linux,通用的创可贴是从定义 _GNU_SOURCE
开始(事后才启用适当的 X/Open 定义)。
如果您的 ncurses 配置包含 reasonably current ncursesw5-config
脚本,它将添加 -D
选项。
原来问题是我包含了错误版本的 <curses.h>
。函数 wborder_set
实现了 unicode 并且需要 ncurses 库的 unicode/wide char 扩展,我将其包含在 #include <ncursesw/curses.h>
中。通过此替换,程序按预期编译。
出于某种原因,-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。
为什么会这样?
您的 <curses.h>
似乎没有包含该函数的原型。 C99 中的规则发生了变化:不再允许使用没有声明的函数。以前,他们会被假定为 return int
.
这与链接无关,但这是一个关于编译器期望函数具有特定 return 类型的问题。
定义 _XOPEN_SOURCE_EXTENDED
会有所帮助,但 Linux(与大多数系统一样)存在与标准冲突的扩展形式的缺陷,以及对标准的不同解释。所以...对于 Linux,通用的创可贴是从定义 _GNU_SOURCE
开始(事后才启用适当的 X/Open 定义)。
如果您的 ncurses 配置包含 reasonably current ncursesw5-config
脚本,它将添加 -D
选项。
原来问题是我包含了错误版本的 <curses.h>
。函数 wborder_set
实现了 unicode 并且需要 ncurses 库的 unicode/wide char 扩展,我将其包含在 #include <ncursesw/curses.h>
中。通过此替换,程序按预期编译。