c++ - 忽略使用 'warn_unused_result' 属性声明的函数的返回值

标签 c++ syntax-error

我正在复制脚本,它似乎没有任何语法错误。 但每次编译时,scanf都会出错。 为什么会出现这种情况?我该如何修复这个脚本?

我的编码环境是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: error: ignoring return value of function declared with 'warn_unused_result' attribute [-Werror,-Wunused-result] scanf("%d %d", &n, &m);
^~~~~ ~~~~~~~~~~~~~~~
./main.cpp:67:7: error: ignoring return value of function declared with 'warn_unused_result' attribute [-Werror,-Wunused-result] scanf("%d", &a1[i][j]);
^~~~~ ~~~~~~~~~~~~~~~
2 errors generated.
make: *** [Makefile:10: main] Error 1

我无法预料哪个部分有问题

最佳答案

从技术上讲,该错误不是错误,只是警告。

函数scanf返回一个值,并且您收到一条警告,表明您没有使用它,因为您使用此标志运行编译器:

-Wunused-result

您还使用此标志:

-Werror

这会将所有警告提升为错误。

要解决这个问题,要么

a) 通过将返回值保存到变量中或直接将其放入 if 中来检查返回值,以验证其是否按预期工作。

b) 主动告诉编译器您不想使用返回值(大大简化,但可行)

std::ignore = scanf(...);

c) 删除警告您有关未使用的返回值的标志

d) 删除引发错误的标志(绝对不推荐,但它会解决您的问题)

关于c++ - 忽略使用 'warn_unused_result' 属性声明的函数的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77469328/

相关文章:

c++ - 创建二维动态数组的函数

C++ 在 vector 中动态访问 vector

c++ - 隐藏第三方C++头文件的内容

c++ - std::initializer_list 的初始化

c++ - 隔离字符中的 1 字符串

ruby-on-rails - Ruby Post Controller中的语法错误

c++ - 没有合适的默认构造函数可用

python - 使用GeoPy时出现打印问题

assembly - 运行代码时出现错误 MIPS “spim: (parser) syntax error”

python - Continue if else in inline for Python