警告:忽略返回值';scanf';,用属性warn\u unused\u result声明 #包括 int main(){ int t; scanf(“%d”、&t); printf(“%d”,t); 返回0; }
我使用ideone.com编译了上述C代码,并弹出以下警告: 程序c:在函数“main”中:警告:忽略返回值';scanf';,用属性warn\u unused\u result声明 #包括 int main(){ int t; scanf(“%d”、&t); printf(“%d”,t); 返回0; },c,C,我使用ideone.com编译了上述C代码,并弹出以下警告: 程序c:在函数“main”中: 程序c:5:警告:忽略返回值 使用属性warn\u unused\u result声明“scanf”的 有人能帮我理解这个警告吗?您的libc的编写者决定在大多数情况下不应忽略scanf的返回值,因此他们给了它一个属性,告诉编译器给您一个警告 如果确实不需要返回值,那么就可以了。然而,通常最好检查一下,以确保您确实成功地阅读了您认为您所做的事情 在您的情况下,可以这样编写代码以避免警告(和一些输入错误)
程序c:5:警告:忽略返回值 使用属性warn\u unused\u result声明“scanf”的
有人能帮我理解这个警告吗?您的libc的编写者决定在大多数情况下不应忽略
scanf
的返回值,因此他们给了它一个属性,告诉编译器给您一个警告
如果确实不需要返回值,那么就可以了。然而,通常最好检查一下,以确保您确实成功地阅读了您认为您所做的事情
在您的情况下,可以这样编写代码以避免警告(和一些输入错误):
#包括
int main(){
int t;
如果(扫描频率(“%d”,&t)==1){
printf(“%d”,t);
}否则{
printf(“读取整数失败。\n”);
}
返回0;
}
scanf,printf是返回值的函数,通常在这类函数中是读取或写入的字符数。如果发生错误,还可以使用返回代码捕获错误。
一个很好的编程实践是查看返回值,但是,我从来没有见过有人查看printf返回值
如果希望警告消失,可能可以更改编译器的严重性 警告(正确)表明不检查scanf
的返回值是个坏主意。函数scanf
已明确声明(通过gcc函数属性),如果放弃其返回值,将触发此警告
如果您真的想忘记这个返回值,同时让编译器(和您的良心)高兴,您可以将返回值强制转换为void:
#include <stdio.h>
int main() {
int t;
if (scanf("%d", &t) == 1) {
printf("%d", t);
} else {
printf("Failed to read integer.\n");
}
return 0;
}
我用gcc(ubuntu4.4.3-4ubuntu5.1)4.4.3尝试了你的例子。 当且仅当优化时(例如使用选项-O2或-O3)才会发出警告。 请求所有警告(-Wall)并不重要。 “强制作废”这一经典成语没有任何效果,它不会抑制警告 我可以通过写信使警告保持沉默
(void)scanf("%d",&t);
这行得通,但对我来说有点晦涩难懂。空{}避免另一个警告-Wempty body执行以下操作:
if(scanf("%d",&t)){};
解决此问题的一种方法是使用
IGUR()
函数,如下所示。非常难看,但是有点便携。(对于不理解内联
的旧编译器,只需#像往常一样定义内联/*nothing*/
。)
#包括
#包括
#包括
内联void IGUR(){}/*忽略GCC未使用的结果*/
void IGUR();/*看见https://stackoverflow.com/a/16245669/490291 */
int
主(内部argc,字符**argv)
{
char buf[10*BUFSIZ];
int-got,fl,have;
fl=fcntl(0,F_GETFL);
fcntl(0,F_设置fl,fl | O_非块);
have=0;
而((got=read(0,buf,sizeof buf))>0)
{
IGUR(write(1,buf,got));
have=1;
}
fcntl(0,F_SETFL,fl);
还有,;
}
顺便说一句,在本例中,无阻塞地从stdin
复制到stdout
,直到读取所有等待的输入,如果没有任何内容,则返回true
(0),否则返回false
(1)。(它可以防止在bash
中读取-t1;do:;done时出现类似的1s延迟)
在-Wall
(Debian Jessie)下编译而不发出警告
编辑:IGUR()
也需要在不使用inline
的情况下定义,以便链接器可以使用它。否则使用cc-O0时可能会失败。见:
Edit2:Newergcc
要求inline
在void
之前,实际上这取决于您需要什么,如果您只是想禁用编译器的警告,您可以通过强制转换忽略函数的返回值,也可以直接处理它,scanf
功能的含义是用户输入的计数
==更新====
你可以用
(void)scanf(“%d”和&t)代码>
在阅读了本页上的所有答案和评论后,要忽略scanf的返回值,我看不到避免警告的其他选项:
使用gcc
编译时,可以将以下内容添加到命令行:
gcc-Wall-Wextra-Wno未使用结果程序c-o程序x
另一个选项是使用-O0
,因为“优化级别0”忽略警告
当使用gcc
如果调试代码,您可以始终使用assert()
,如下例所示:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
inline void IGUR() {} /* Ignore GCC Unused Result */
void IGUR(); /* see https://stackoverflow.com/a/16245669/490291 */
int
main(int argc, char **argv)
{
char buf[10*BUFSIZ];
int got, fl, have;
fl = fcntl(0, F_GETFL);
fcntl(0, F_SETFL, fl|O_NONBLOCK);
have = 0;
while ((got=read(0, buf, sizeof buf))>0)
{
IGUR(write(1, buf, got));
have = 1;
}
fcntl(0, F_SETFL, fl);
return have;
}
但是现在,如果您通过#define NDEBUG
关闭assert,您将得到一个-wused但set变量。然后,您可以通过以下两种方式之一关闭第二次警告:
将-Wno未使用但设置变量
添加到gcc
命令行,或
声明具有以下属性的变量:intu\uu属性(未使用))代码>
正如在另一个答案中指出的那样,不幸的是,第二个选项不是很便于携带,尽管它似乎是最好的选项
最后,定义的宏如果您确定要忽略给定函数的返回,但关闭所有未使用函数返回的警告并不舒服,则以下定义的宏可以帮助您:
u = scanf("%d", &t);
assert(u == 1);
另请参见由于没有参数的函数在C中有效,因此可以执行以下操作:
#define igr(x) {__typeof__(x) __attribute__((unused)) d=(x);}
double __attribute__ ((warn_unused_result)) fa(void) {return 2.2;}
igr(fa());
#包括
静态内联void ignore_ret(){}
int main(){
int t;
忽略_ret(scanf(“%d”和&t));
返回0;
}
有人能帮他吗
u = scanf("%d", &t);
assert(u == 1);
#define igr(x) {__typeof__(x) __attribute__((unused)) d=(x);}
double __attribute__ ((warn_unused_result)) fa(void) {return 2.2;}
igr(fa());
#include <stdio.h>
static inline void ignore_ret() {}
int main() {
int t;
ignore_ret(scanf("%d", &t));
return 0;
}
[&]{ return scanf("%d", &t); }();