gpt4 book ai didi

c - 为什么使用 -O(1/2/3) 选项进行优化会干扰 scanf()?

转载 作者:行者123 更新时间:2023-12-04 03:58:29 24 4
gpt4 key购买 nike

我正在尝试使用启用了优化的 gcc 编译 C 程序。

gcc [name] -lm

工作正常,但只要我添加 -O3 它就会给我这个警告:

warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]

我在这里错过了什么?

最佳答案

Why does this warning depend on the optimization level? [from comment section]

主要原因是不同的优化级别启用了一定的分析。

绝对最好的方法是按照编译器告诉你的去做。不检查各种函数的返回值是许多错误的根源。只需做这样的事情:

if(scanf("%d%d", &x, &y) != 2) { /* Handle error * }

警告将消失。

如果您决定自己比编译器更了解并且只是想让它关闭,那么您也可以按照警告告诉您的那样做,即使它是如何完成的并不那么明显。使用此代码:

#pragma GCC diagnostic warning "-Wunused-result"

该方法可用于很多警告。然而,在这种特殊情况下,转换结果更为传统:

(void)scanf( ...

但这并不总是有效。

请注意,所有这些都各有利弊。例如,如果您出于某种原因能够证明来自 stdin 的所有输入都具有正确的形式,并且您永远不会从中读取失败,那么一定要取消激活警告。另一件事可能是您有特殊需求,例如极端性能和/或非常有限的资源,或者可能是其他一些原因,对其进行风险分析并查看风险是否可以接受可能是一个明智的选择。

但作为一般规则,不要停用编译器警告,除非您非常非常确定编译器警告的事情不会造成麻烦。 “我不想看到很多警告”不是禁用警告的好理由。

关于c - 为什么使用 -O(1/2/3) 选项进行优化会干扰 scanf()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63476075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com