cfmakeraw ошибка неявного объявления

Я пишу многопоточное приложение (как домашнее задание). Один из этих потоков предназначен для чтения нажатий на клавиатуру, поэтому используйте терминал в режиме raw. Но я продолжаю получать ошибку

error: implicit declaration of function ‘cfmakeraw’ [-Werror=implicit-function-declaration]
     cfmakeraw(&tio);

хотя у меня есть unistd.h и termios.h включены.

Я программирую на Linux (xubuntu 16.04), используя gcc 5.4.0 с флагом -std=c99. Код выглядит примерно так:

#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <termios.h>
#include <pthread.h>

#include "prg_serial_nonblock.h"

void set_raw(_Bool set);

int main(int argc, char *argv[]) {
    // terminal raw mode
    set_raw(true);

    // ... some thread magic ...

    set_raw(false);
    printf("\n");
}

void set_raw(_Bool set) {
    static struct termios tio, tioOld;
    tcgetattr(STDIN_FILENO, &tio);

    if (set) { // put the terminal to raw
        tioOld = tio; //backup
        cfmakeraw(&tio);
        tio.c_lflag &= ~ECHO; // assure echo is disabled
        tcsetattr(STDIN_FILENO, TCSANOW, &tio);
    }
    else {      // set the previous settingsreset
        tcsetattr(STDIN_FILENO, TCSANOW, &tioOld);
    }
}

1 ответ

Решение

Как сказано в справочной странице,

Требования к макросу тестирования возможностей для glibc (см. Feature_test_macros (7)):

cfsetspeed(), cfmakeraw():
С glibc 2.19:
_DEFAULT_SOURCE
Glibc 2.19 и ранее:
_BSD_SOURCE

Так что вы должны добавить -D_BSD_SOURCE -D_DEFAULT_SOURCE в командной строке или добавить #define _BSD_SOURCE а также #define _DEFAULT_SOURCE перед любой системой #include,

Другие вопросы по тегам