0

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

而对于某些功能,例如:

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 中的警告静音。

谢谢。

4

4 回答 4

1

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

(void)var;
于 2014-05-13T14:13:22.973 回答
0

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

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

然后使用它

remove_warning_for_unused_variable(variable);
于 2014-05-13T14:50:56.357 回答
0

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

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

带有的行ptr2甚至不应该按原样编译,因为它obj1是一种类型,您不能应用于->它。但我假设您实际上的意思是ptr1->xxxx(xxx),在这种情况下ptr1确实使用并且只ptr2需要删除 - 只需ptr1保持原样,只需替换ptr2调用的声明即可ptr1->xxxx(xxx);。并确保指向的对象ptr1没有泄漏。

于 2014-05-13T14:24:03.820 回答
0

首先,你为什么注释掉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++ 仍然设置为大喊大叫时可能无关紧要)。

于 2014-05-13T14:15:38.727 回答