Как исправить 'неявное объявление функции' pipe2 'недопустимо в C99' - PullRequest
3 голосов
/ 27 марта 2019

Я пытаюсь собрать свою библиотеку, но файл с именем evutil.c от libevent доставляет мне неприятности.

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 ]

2 голосов
/ 27 марта 2019

Вы должны включить заголовки, которые объявляют функции, которые вы используете. Чтобы выяснить, какие заголовки вам нужны, вам нужно обратиться к документации по функциям. В функциях 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 голосов
/ 27 марта 2019

Это не проблема C99.Вам необходимо включить заголовок для pipe2. Согласно руководству pipe2 , то есть unistd.h.

Почему libevent не делает этого сам по себе, является правильным вопросом.

0 голосов
/ 27 марта 2019

Обновление до C11 не ответ;скорее понижение до C90, где неявные объявления разрешены (но будут генерироваться предупреждения), или, по крайней мере, компиляция с более разрешающими опциями компилятора - возможно, -std=gnu99 или -std=c90 в сочетании с -Wno-implicit для подавления предупреждения.

Лучшей альтернативой является включение соответствующего заголовка <unistd.h> в evutil.c, однако вы можете предпочесть не изменять код библиотеки, и в этом случае вы можете скомпилировать его с принудительным включением с опцией компилятора -include unistd.h.Эта опция препроцессора будет обрабатывать файл исходного файла так, как если бы в первой строке появилось #include «file».

0 голосов
/ 27 марта 2019

В верхней части manpage находится

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

Вам нужны эти заголовки и макрос тестирования возможностей.

Тогда идентификатор должен стать доступным, как минимумв Linux / glibc.

Пример:

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

int main()
{
    (void)&pipe;
}
...