8

我在 ac 程序中使用 scanf 从 STDIN 读取一个 int:

scanf("%d", &n);

当我编译启用优化的 c 程序时,我收到一些警告:

gcc main.c -lm -lpthread -O2 -o main
main.c: In function ‘main’:
main.c:45: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result
main.c:50: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result

但是当我删除优化选项时,为什么我没有收到这些警告?

gcc main.c -lm -lpthread -o main

PS:我没有使用 -Wall 或类似的东西。

4

2 回答 2

11

更改优化器设置会更改编译器分析代码的程度(以及方式)。

某些程序流分析在未启用优化(或设置不够高)时未完成,因此不会发出相关警告。
您会经常看到“未使用的变量”警告 - 这些需要对代码进行分析,超出了简单编译所需的范围,因此您通常只会在启用优化的情况下获得它们。

(你真的应该用 . 编译-Wall。)

于 2012-06-16T08:46:35.490 回答
3

-Wunused-result默认情况下启用:因为您将积极地需要装饰一个函数__attribute__ ((warn_unused_result))来触发警告,所以误报只会在使用过度时发生。

即使没有传递额外的标志,gcc也应该产生警告。然而,正如 Mat 解释的那样,编译器不会在不提高优化级别的情况下进行必要的控制流分析。

通过添加来修复您的代码或使警告静音-Wno-unused-result将返回值转换为void也可能会这样做。

要使代码中的警告静音,您需要将返回值分配给一个虚拟变量,然后您可以将其转换void为避免有关未使用变量的新警告。也可以用 C99 复合文字代替显式声明的变量(用 gcc 4.5.3 测试)。

这确实不是最佳选择 - 我真的希望void我最初打算使用的 -cast ......

于 2012-06-16T09:17:31.097 回答