从C++中删除"unused variable"警告

Remove "unused variable" warinings from C++

本文关键字:unused 警告 variable 删除 C++      更新时间:2023-10-16

我得到了一些代码,并试图删除所有的警告为给定的代码。

而对于某些功能,如:

sub_main(int /*argc*/, char** /*argv*/){
-------------
obj1* ptr1 = new obj1(xxx);
obj2* ptr2 = obj1->xxxx(xxxx)
-------------
}

而这个ptr1和ptr2在这个函数中根本不使用。(它应该在某个地方使用,因为如果我注释掉它们,我就会得到某些错误)。

还有一些方法可以对未使用的参数(如

)静音警告
sub_main(int /*argc*/ )

sub_main(int a _ _ attribute_ _ ((unused)))

对于未使用的变量,是否有类似的整洁方法来消除警告?

我不想为gcc做一些ifdef来删除警告或沉默makefile中的警告。

谢谢。

对于未使用的变量var,可以使用:

(void)var;

首先,为什么注释掉argc和argv ?如果您不打算使用它们,则不需要它们。你可以简单地

sub_main()

,这就足够了,但是如果您打算使用它们,无论何时应该包含它们。这看起来有点像K&R/ANSI C,如果你使用c++ 98+,你应该这样定义它们:

int sub_main(int argc, char ** const argv)
{
    ...
    return 0; //or whatever
}

有效的K&R/ANSI语法应该是

sub_main(argc, argv) //int left off as it defaults to int
int argc;
char ** const argv;
{
    ...
    return 0; //or whatever
}

同样,未使用的变量警告部分来自于你对参数名的注释(C/c++倾向于忽略未使用的参数,但喜欢对未命名的参数吹毛求疵,尽管c++ 99以后它是有效的,并且对于某些函数是必需的,例如后缀操作符)

另一个问题是,您从未使用变量ptr1ptr2。一旦你使用它们,警告就会消失。如果您根本不打算使用它们,则不应该定义它们,因为这通常会浪费内存(尽管目前c++仍然设置为大喊大叫可能无关紧要)。

当您遇到警告时,您的第一步(第二步,可能是第三步)应该是尝试通过解决它来消除它。只有当你真正确定它是假的,你才应该让它闭嘴。

在您的情况下,如果根本不使用ptr1,则不要声明它。你说删除它会在其他地方引入错误。这意味着obj1在它的构造函数中做了一些疯狂的事情(比如在某处注册新创建的实例),或者整个代码是一团糟。如果是前者,只需删除变量定义并将new obj1(xxx);作为语句执行。但是首先要确保指针被存储在某个地方,并且通过new表达式旁边的注释来记录

包含ptr2的行甚至不应该像现在这样编译,因为obj1是一个类型,你不能对它应用->。但我假设您实际上指的是ptr1->xxxx(xxx),在这种情况下,确实使用了ptr1,只有ptr2需要删除-只需保留ptr1原样,只需通过调用ptr1->xxxx(xxx);替换ptr2的声明。并且确保ptr1所指向的对象没有泄漏。

避免此警告的方法是定义如下函数:

template <typename T> remove_warning_for_unused_variable(const T&) {}

然后使用

remove_warning_for_unused_variable(variable);