#include <stdio.h>
int main() {
int t;
scanf("%d", &t);
printf("%d", t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用ideone.com编译了上面的C代码,并弹出以下警告:
prog.c:在函数'main'中:
prog.c:5:警告:忽略'scanf'的返回值,使用属性warn_unused_result声明
有人能帮我理解这个警告吗?
Eva*_*ran 63
你的libc的作者已经决定scanf在大多数情况下不应该忽略返回值,所以他们给它一个属性告诉编译器给你一个警告.
如果真的不需要返回值,那么你没事.但是,通常最好检查它以确保您确实成功地阅读了您认为自己所做的事情.
在您的情况下,代码可以这样写,以避免警告(和一些输入错误):
#include <stdio.h>
int main() {
int t;
if (scanf("%d", &t) == 1) {
printf("%d", t);
} else {
printf("Failed to read integer.\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Ale*_* C. 16
警告(正确)表示不检查返回值是一个坏主意scanf.如果您丢弃其返回值,scanf则已显式声明该函数(通过gcc函数属性)以触发此警告.
如果你真的想忘记这个返回值,同时保持编译器(和你的良心)满意,你可以将返回值转换为void:
(void)scanf("%d",&t);
Run Code Online (Sandbox Code Playgroud)
我用gcc(Ubuntu 4.4.3-4ubuntu5.1)4.4.3尝试了你的例子.当且仅当优化时,例如使用选项-O2或-O3发出警告.请求所有警告(-Wall)并不重要.铸造到虚空的经典习语没有效果,它不会抑制警告.
我可以通过写作来消除警告
if(scanf("%d",&t)){};
Run Code Online (Sandbox Code Playgroud)
这有效,但对我的口味来说有点模糊.Empty {}避免了另一个警告-Wempty-body
小智 5
做这个:
int main() {
int t;
int unused __attribute__((unused));
unused = scanf("%d",&t);
printf("%d",t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)