【问题标题】:I'm getting an implicit declaration error only when using -std=c99仅在使用 -std=c99 时出现隐式声明错误
【发布时间】: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,但没有帮助。

标签: c gcc c99 ncurses


【解决方案1】:

您的&lt;curses.h&gt; 似乎没有包含该函数的原型。 C99 中更改的规则:不再允许使用没有声明的函数。之前,他们会被假定返回int

这与链接无关,但这是一个关于编译器期望函数返回特定类型的问题。

【讨论】:

  • 函数wborder_set在curses.h中声明;我可以忽略该警告并期望它像在 c89 中一样工作吗?我需要将原型从 curses.h 复制到我的代码文件中吗???
  • @sig_seg_v,不,如果代码如您在此处给出的那样,编译器不会找到该函数的声明。您不应忽略此类警告,它们表明您的工具链中有问题。
【解决方案2】:

定义_XOPEN_SOURCE_EXTENDED 会有所帮助,但Linux(与大多数系统一样)存在与标准冲突的扩展形式的缺陷,以及对标准的不同解释。所以...对于 Linux,通用的创可贴是从定义 _GNU_SOURCE 开始(这会在事后打开适当的 X/Open 定义)。

如果您的 ncurses 配置包含 reasonably current ncursesw5-config 脚本,它将添加 -D 选项。

【讨论】:

    【解决方案3】:

    原来问题在于我包含了错误版本的&lt;curses.h&gt;wborder_set 函数实现了 unicode,并且需要 ncurses 库的 unicode/wide char 扩展,我包含在 #include &lt;ncursesw/curses.h&gt; 中。通过这种替换,程序按预期编译。

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2020-04-18
      相关资源
      最近更新 更多