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的编译器上失败。