【问题标题】:Remove "unused variable" warinings from C++ [duplicate]从 C++ 中删除“未使用的变量”警告 [重复]
【发布时间】:2014-07-01 06:21:31
【问题描述】:

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

而对于某些功能,例如:

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

谢谢。

【问题讨论】:

  • 消除未使用变量警告的常用方法是声明(void)unused;
  • 顺便说一句:我希望你用-Wall -Wextra编译。那么,编译器怎么会接受一个没有返回类型的函数呢?
  • ptr1ptr2sub_main 中本地定义。你说如果你把它们注释掉,你会得到错误——这意味着你正在sub_main的某个地方使用它们。在 C++ 中,不能定义没有返回类型的函数(除非它是构造函数或析构函数)。请更新您的问题以显示完整的独立示例,以及您从编译器获得的确切警告消息。阅读:sscce.org
  • obj1->xxxx?真的吗?

标签: c++ gcc warnings unused-variables


【解决方案1】:

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

(void)var;

【讨论】:

【解决方案2】:

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

【讨论】:

  • 问题是关于C++的,它从来不支持老式的函数定义,所以没有必要提。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    然后使用它

    remove_warning_for_unused_variable(variable);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多