如何修复“函数'pipe2'的隐式声明在C99中无效”

时间:2019-03-27 20:05:57

标签: c c99

我正在尝试构建我的库,但libevent文件evutil.c给我带来了麻烦。

libevent/evutil.c: error: implicit declaration of function 'pipe2' is invalid in C99

涉及的代码是:

    if (pipe2(fd, O_NONBLOCK|O_CLOEXEC) == 0)
        return 0;

我现在无法将代码更新为c11。 我应该如何更改代码以不再收到此错误?

4 个答案:

答案 0 :(得分:2)

这不是C99问题。您需要包括pipe2的标题。 According to the pipe2 manualunistd.h

为什么libevent本身不执行此操作是一个有效的问题。

答案 1 :(得分:2)

您需要包括标头,这些标头声明您正在使用的功能。为了弄清楚您需要哪些标题,您需要查阅功能文档。在Posix函数上,最好的来源是man

man pipe2将为您提供以下内容:

PIPE(2)                    Linux Programmer’s Manual                   PIPE(2)

NAME
       pipe, pipe2 - create pipe

SYNOPSIS
       #include <unistd.h>

       int pipe(int pipefd[2]);

       #define _GNU_SOURCE
       #include <unistd.h>

       int pipe2(int pipefd[2], int flags);

就在大纲中,您将看到所需的头文件。

答案 2 :(得分:0)

manpage顶部是

this.events.subscribe('gotochat', (item) => {
  this.navCtrl.push('ItemDetailPage', {
    home: true,
    chat: item.item
  })
})

您需要这些标头和功能测试宏。

然后至少在Linux / glibc上标识符应该可用。

示例:

#define _GNU_SOURCE             /* See feature_test_macros(7) */
#include <fcntl.h>              /* Obtain O_* constant definitions */
#include <unistd.h>

答案 3 :(得分:0)

升级到C11不是解决方案;宁可降级到允许隐式声明的C90(但会生成警告),或者至少使用更宽松的编译器选项进行编译-也许-std=gnu99-std=c90-Wno-implicit组合使用以抑制警告。

一个更好的选择是在evutil.c中包含适当的头文件<unistd.h>,但是您可能不希望修改库代码,在这种情况下,可以使用编译器选项{{ 1}}。此预处理程序选项将处理源文件文件,就像#include“ file”出现在第一行一样。