如何最好地消除有关未使用变量的警告?

319

我有一个跨平台应用程序,在一些函数中并没有使用传递给函数的所有值。因此,GCC会警告我存在未使用的变量。

如何最好地编写代码以避免这个警告?

在函数周围添加 #ifdef 呢?

#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{

这看起来很丑陋,但似乎是编译器喜欢的方式。

或者我在函数末尾将变量赋值为零?(我讨厌这种方法,因为它会改变程序流以消除编译器警告)。

有没有正确的方式?


7
我刚意识到你去年11月曾提出过类似的问题,所以这就是为什么它看起来很熟悉! ;) https://dev59.com/5XVC5IYBdhLWcg3wZwJT#308286 - Alex B
9
为什么不在两个编译器中都将它们注释掉?如果一个参数在一个编译器上未被使用,那么可能在另一个编译器上也未被使用... - Roger Lipscombe
12
你应该知道Qt有一个Q_UNUSED宏专门用于这个。在文档中查看它。 - Evan Teran
1
C语言的解决方案在C++中也可以正常工作:https://dev59.com/EXA65IYBdhLWcg3w2iip#3599170 - JonnyJD
如果您可以使用特定于编译器的构建标志,那么“-Wno-unused-parameter”也可能是一种选择。 - Code Abominator
核心指南 F9: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-unused - GrendleM
23个回答

0
定义一个用于未使用的局部变量的宏:
#define UNUSED(x)  (void)((x))

-1

你可以使用__unused告诉编译器该变量可能不会被使用。

- (void)myMethod:(__unused NSObject *)theObject    
{
    // there will be no warning about `theObject`, because you wrote `__unused`

    __unused int theInt = 0;
    // there will be no warning, but you are still able to use `theInt` in the future
}

2
哪个编译器?因为__unused不是标准的C++,更重要的是,你发布的代码也不是标准的C++,而是Objective-C。所以这个答案只对特定的编译器有用,并且它使得代码不可移植,实际上并不是有效的,因为用户代码不应该使用以__开头的标识符,这些标识符被保留给实现。 - underscore_d

-16

我没有看出你对这个警告有什么问题。在方法/函数头中记录编译器xy将在此处发出(正确的)警告,但这些变量是平台z所需的。

警告是正确的,不需要关闭它。它并不使程序无效-但应该记录下来,因为有一个原因。


23
问题在于,如果你有数百或数千个这样的警告,你可能会错过有用的那一个。(我曾两次陷入这种情况,需要浏览数万个警告,排除大部分,找到几个真正有用的提示严重错误的警告。) 如果可能的话,最好以最高警告级别编译,避免出现警告。 - sbi
6
去年我参与的一个项目中,我打开了最高级别的警告等级,得到了大约10,000个警告。其中只有几十个是真正有用的。这些里面隐藏着十几个非常严重的bug,但花费了数周时间来清理代码库,才能确切地“看到”这些严重的问题。如果一直保持高警告级别并保持代码无警告,那么这些错误就不会悄悄地出现在代码中。 - sbi
1
抱歉 - 在项目后期进行静态代码分析(使用任何可用的工具,即使只是编译器)有点像编写整个程序,完成后按下编译按钮并希望没有错误。 - Tobias Langner
2
@Richard:我曾经参与过数千个源文件的项目。即使是一些良好记录的警告,稍有不慎也会迅速累积。即使在编译过程中只有几十个警告(而不是数百或数千个),逐个查看它们是否为新警告或已记录的警告也太耗费时间,在最终也不会被完成。因此:以最高可能的警告级别进行编译,并确保零警告。每个出现的警告都将立即被注意到,查看并进行修复或抑制。 - sbi
2
@sbi:为编译器打开最高警告级别是某种静态代码分析。静态代码分析只是读取代码而不执行它,并从中推断信息。这正是编译器在检查警告规则时所做的。 - Tobias Langner
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接