自带 getch 函数的隐式转换警告
Implicit conversion warning with own getch function
我找到了 conio.h 的 getch() 的 c 实现。可悲的是,它编译时带有一个转换警告,我不知道我应该怎么做才能正确解决它。
我找到了 this link,但我不知道如何实现它。
#include<termios.h>
#include<unistd.h>
#include<stdio.h>
#include"getch.h"
/* reads from keypress, doesn't echo */
int getch(void)
{
struct termios oldattr, newattr;
int ch;
tcgetattr( STDIN_FILENO, &oldattr );
newattr = oldattr;
newattr.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
return ch;
}
/* reads from keypress, echoes */
int getche(void)
{
struct termios oldattr, newattr;
int ch;
tcgetattr( STDIN_FILENO, &oldattr );
newattr = oldattr;
newattr.c_lflag &= ~( ICANON );
tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
return ch;
}
CLANG 3.5 returns:
getch.c:13:24: warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
newattr.c_lflag &= ~( ICANON | ECHO );
~~ ^~~~~~~~~~~~~~~~~~
getch.c:27:24: warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
newattr.c_lflag &= ~( ICANON );
~~ ^~~~~~~~~~~
2 warnings generated.
由于整数提升,这些定义被提升为 int,但 c_lflag 成员是无符号整数。
确保按位运算以无符号类型完成:
newattr.c_lflag &= ~( 0u | ICANON | ECHO );
^
我找到了 conio.h 的 getch() 的 c 实现。可悲的是,它编译时带有一个转换警告,我不知道我应该怎么做才能正确解决它。 我找到了 this link,但我不知道如何实现它。
#include<termios.h>
#include<unistd.h>
#include<stdio.h>
#include"getch.h"
/* reads from keypress, doesn't echo */
int getch(void)
{
struct termios oldattr, newattr;
int ch;
tcgetattr( STDIN_FILENO, &oldattr );
newattr = oldattr;
newattr.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
return ch;
}
/* reads from keypress, echoes */
int getche(void)
{
struct termios oldattr, newattr;
int ch;
tcgetattr( STDIN_FILENO, &oldattr );
newattr = oldattr;
newattr.c_lflag &= ~( ICANON );
tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
return ch;
}
CLANG 3.5 returns:
getch.c:13:24: warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
newattr.c_lflag &= ~( ICANON | ECHO );
~~ ^~~~~~~~~~~~~~~~~~
getch.c:27:24: warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
newattr.c_lflag &= ~( ICANON );
~~ ^~~~~~~~~~~
2 warnings generated.
由于整数提升,这些定义被提升为 int,但 c_lflag 成员是无符号整数。
确保按位运算以无符号类型完成:
newattr.c_lflag &= ~( 0u | ICANON | ECHO );
^