仅在使用 -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> 中。通过此替换,程序按预期编译。