C++ 删除“;“未使用变量”;来自C+的警告+;

C++ 删除“;“未使用变量”;来自C+的警告+;,c++,gcc,warnings,unused-variables,C++,Gcc,Warnings,Unused Variables,我得到一些代码,并试图删除所有的警告,为给定的代码 而对于某些功能,如: sub_main(int /*argc*/, char** /*argv*/){ ------------- obj1* ptr1 = new obj1(xxx); obj2* ptr2 = obj1->xxxx(xxxx) ------------- } template <typename T> remove_warning_for_unused_variable(const T&)

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

而对于某些功能,如:

sub_main(int /*argc*/, char** /*argv*/){

-------------
obj1* ptr1 = new obj1(xxx);
obj2* ptr2 = obj1->xxxx(xxxx)

-------------

}
template <typename T> remove_warning_for_unused_variable(const T&) {}
而这个ptr1和ptr2根本不在这个函数中使用。(应该在某个地方使用它,因为如果我将它们注释掉,就会出现某些错误)

还有一些方法可以消除未使用参数的警告,如

sub_main(int /*argc*/ )

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

我不想为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以后的版本是有效的,并且对于某些函数是必需的,比如后缀运算符)


另一个问题是,您从未使用变量
ptr1
ptr2
。一旦你使用它们,警告就会消失。如果你根本不打算使用它们,那么它们不应该被定义为它通常是内存的浪费(虽然现在C++可能仍然没有被设置为叫喊)。

< P>当你遇到警告时,你的第一步(和第二步,大概第三步)应该尝试通过解决它来移除它。只有当你真正确定这是假的时候,你才应该去压制它

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


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

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

sub_main(int /*argc*/, char** /*argv*/){

-------------
obj1* ptr1 = new obj1(xxx);
obj2* ptr2 = obj1->xxxx(xxxx)

-------------

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

使未使用变量警告静音的常用方法是语句
(void)unused顺便说一句:我希望您使用
-Wall-Wextra
进行编译。那么,编译器为什么接受没有返回类型的函数呢?
ptr1
ptr2
sub_main
中本地定义。你说如果你把它们注释掉,你会得到错误——这意味着你在
sub_main
的某个地方使用它们。在C++中,不能定义没有返回类型的函数(除非它是构造函数或析构函数)。请更新您的问题,以显示一个完整的自包含示例,以及您从编译器获得的确切警告消息。阅读以下内容:
obj1->xxxx
?真的吗?问题是关于C++,它从未支持旧的函数定义,所以在提到它们时没有任何意义。根据这个(5)在基于EDG的编译器上失败。