cfmakeraw 隐式声明错误
cfmakeraw implicit declaration error
我正在编写多线程应用程序(作为作业)。其中一个线程专用于读取键盘按键,因此在原始模式下使用终端。但我不断收到错误
error: implicit declaration of function ‘cfmakeraw’ [-Werror=implicit-function-declaration]
cfmakeraw(&tio);
尽管我有 unistd.h 和 termios.h。
我正在使用带有 -std=c99 标志的 gcc 5.4.0 在 Linux (xubuntu 16.04) 上编程。代码类似于:
#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);
}
}
正如 manpage 所说,
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
cfsetspeed(), cfmakeraw():
Since glibc 2.19:
_DEFAULT_SOURCE
Glibc 2.19 and earlier:
_BSD_SOURCE
因此您应该在命令行中添加 -D_BSD_SOURCE -D_DEFAULT_SOURCE
,或者在任何系统 #include
.
之前添加 #define _BSD_SOURCE
和 #define _DEFAULT_SOURCE
我正在编写多线程应用程序(作为作业)。其中一个线程专用于读取键盘按键,因此在原始模式下使用终端。但我不断收到错误
error: implicit declaration of function ‘cfmakeraw’ [-Werror=implicit-function-declaration]
cfmakeraw(&tio);
尽管我有 unistd.h 和 termios.h。
我正在使用带有 -std=c99 标志的 gcc 5.4.0 在 Linux (xubuntu 16.04) 上编程。代码类似于:
#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);
}
}
正如 manpage 所说,
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
cfsetspeed(), cfmakeraw():
Since glibc 2.19:
_DEFAULT_SOURCE
Glibc 2.19 and earlier:
_BSD_SOURCE
因此您应该在命令行中添加 -D_BSD_SOURCE -D_DEFAULT_SOURCE
,或者在任何系统 #include
.
#define _BSD_SOURCE
和 #define _DEFAULT_SOURCE