提问人:kevin0206 提问时间:11/12/2023 最后编辑:Raymond Chenkevin0206 更新时间:11/13/2023 访问量:75
忽略使用“warn_unused_result”属性声明的函数的返回值
ignoring return value of function declared with 'warn_unused_result' attribute
问:
我正在复制一个脚本,它似乎没有任何语法错误。 但是每次我编译它时,扫描都会发生错误。 为什么会这样?我该如何修复这个脚本?
我的编码环境是 replit.com
#include <stdio.h>
int a1[101][101], a2[101][101]; //치즈
int n, m;
void copy() { //a2를 a1과 같은 모양으로
int i, j;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
a1[i][j] = a2[i][j];
}
void fill1(int x, int y) { //초기에 바깥공기인 칸들의 값을 2로 만든다.
if (x < 1 || y < 1 || x > n || y > m)
return;
if (a1[x][y] == 0) {
a1[x][y] = 2;
fill1(x + 1, y);
fill1(x - 1, y);
fill1(x, y + 1);
fill1(x, y - 1);
}
}
void fill2(int x, int y) { //fill1과 같음, 그러나 a2 치즈에 대한 코드
if (x < 1 || y < 1 || x > n || y > m)
return;
if (a2[x][y] == 0) {
a2[x][y] = 2;
fill2(x + 1, y);
fill2(x-1, y);
fill2(x, y + 1);
fill2(x, y-1);
}
}
void fill3(int x, int y) { //c로 표지됐던 치즈 칸이나, 새롭게 연결된 빈 공기 간들을 바깥공기 2로 만든다
if (x < 1 || y < 1 || x > n || y > m)
return;
if (a1[x][y] == 3 || a1[x][y] == 0) {
a1[x][y] = 2;
fill3(x + 1, y);
fill3(x - 1, y);
fill3(x, y + 1);
fill3(x, y - 1);
}
}
int check(int x, int y) { //치즈 한 칸이 바깥공기랑 만나는 면이 몇 개인가요?
int t = 0;
if (a1[x + 1][y] == 2) //치즈의 오른쪽이 바깥공기인가요?
t++;
if (a1[x - 1][y] == 2) //치즈의 왼쪽이 바깥공기인가요?
t++;
if (a1[x][y + 1] == 2) //치즈의 위쪽이 바깥공기인가요?
t++;
if (a1[x][y - 1] == 2) //치즈의 아래쪽이 바깥공기인가요?
t++;
return t;
}
int main() {
int i, j, hour = 0, count;
scanf("%d %d", &n, &m);
for (i = 1;i <= n; i++)
for (j = 1; j <= m; j++) {
scanf("%d", &a1[i][j]);
a2[i][j] = a1[i][j];
}
fill3(1, 1);
while (1) {
count = 0;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++) {
if (a1[i][j] == 1 && check(i, j) >= 2) {
a2[i][j] = 0;
count++;
}
}
if (count == 0) {
printf("%d", hour); break;
}
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
if (a1[i][j] == 1 && a2[i][j] == 0)
fill2(i, j);
hour++;
copy();
}
return 0;
}
错误:
./main.cpp:64:3:错误:忽略使用“warn_unused_result”属性声明的函数的返回值 [-Werror,-Wunused-result] scanf(“%d %d”, &n, &m);
^~~~~ ~~~~~~~~~~~~~~~~
./main.cpp:67:7:错误:忽略使用“warn_unused_result”属性声明的函数的返回值 [-Werror,-Wunused-result] scanf(“%d”, &a1[i][日]);
^~~~~~~~~~~~~~~~~~~~
生成 2 个错误。
make: *** [Makefile:10: main] 错误 1
我无法预料到哪个部分是问题
答:
2赞
infinitezero
11/12/2023
#1
从技术上讲,该错误不是错误,只是一个警告。
该函数返回一个值,并且您会收到一条警告,指出您没有使用它,因为您使用以下标志运行编译器:scanf
-Wunused-结果
您还可以使用此标志:
-错误
这会将所有警告提升为错误。
要解决此问题,请执行以下任一操作
a) 通过将返回值保存到变量中或直接将其放入 if 中来检查返回值,以验证它是否按预期工作。
b) 主动告诉编译器你不想使用返回值(粗略简化,但有效)
std::ignore = 扫描(...);
c) 删除警告您未使用的返回值的标志
d) 删除提升错误的标志(绝对不推荐,但它会解决您的问题)
评论
2赞
user4581301
11/13/2023
绝对更喜欢检查值。通常,未经检查和处理的结果代码通常会变成错误。不检查 IO 事务的返回代码是增加必须执行的调试量的最简单方法之一。用户是可怕的输入源,无论他们只是输入错别字,还是因为他们是恶意的<脏话删除>故意试图破坏程序。永远不要信任用户。
评论
scanf
if (scanf("%d %d", &n, &m) != 2) { /* handle error */ }
-Wunused-result
scanf
-Werror