C++ g++;不显示';未使用的';警告
我有一小段C++代码:C++ g++;不显示';未使用的';警告,c++,g++,C++,G++,我有一小段C++代码: #include <iostream> #include <iterator> #include <string> using namespace std; int main() { int i=0; istream_iterator<string> EOS; double x; return 0; } 并获得: test.cc: In function 'int main()':
#include <iostream>
#include <iterator>
#include <string>
using namespace std;
int main() {
int i=0;
istream_iterator<string> EOS;
double x;
return 0;
}
并获得:
test.cc: In function 'int main()':
test.cc:9: warning: unused variable 'i'
test.cc:11: warning: unused variable 'x'
为什么对未使用的EOS没有警告?它不是一个基本值,因此它的构造函数和/或析构函数可能会产生预期的副作用 为了说明在实践中会发生这种情况:我使用一个类来计时代码的各个部分,大致如下所示:
class Timed {
double start;
public:
Timed() { start = now(); }
~Timed() { std::cout << (now() - start) << '\n'; }
}
变量t
从未被使用过,但它对代码的行为仍然很重要。istream\u迭代器有一个构造函数,因此EOS
的声明实际上不像i
和x
的声明那样是不可操作的
通常,您希望声明一个类类型对象,然后不对其执行任何操作。例如,在C++ 0x中考虑<代码> STD::LoopSuxGue//Cuff>(<代码> Boo::SopEdjyLoop< <代码>升压)或任何其他类型的范围守护类。您通常不想对此类对象执行任何操作,您只想创建对象,以便在块的末尾运行其析构函数,以执行需要执行的任何清理操作。,因为这样做是有目的的。它不是原始的。也许构造函数和析构函数做了一些重要的事情
MFC甚至有这样操作的类,您可以这样做:
void foo()
{
CWaitCursor cursor;
[...]
}
这将在函数执行期间显示一个沙漏图标。+1用于使用析构函数计算计时结束。酷伎俩。它叫RIAA,从C++诞生以来一直是一个设计目标(见Bjarne Stroustrup)@塞赫你可能是RAII:——不是吗?应该看到这让我想起了性能跟踪:)它使用相同的机制来跟踪函数/块的性能(免责声明:我是这个库的开发人员)--woops刚刚注意到这个线程非常古老:)SOFACT万岁:EOS
不是lock\u-guard
或任何类型的变量,其唯一用途是其析构函数的效果,这是大多数情况下发生的情况,有std::string
,等等。因此,这里确实应该有一个警告,因此,用户注意到它可以消除变量,从这个意义上讲,未使用的std::string
与未使用的int
在高级别上有什么大区别?没有一个这是C++中的一个设计问题。@ PopPrPyChio编译器必须非常聪明地推断出,而<代码> ~ istrAMyIdActuple()/Cuth>并不微不足道,EthCudith> istRAMMyTyror()/<代码>和 ItReMaMyTyror()/<代码>具有与它们相同的结果。在一般情况下,这种聪明是不可能的,因此必须有一个分析停止的点early@Caleth这些是实施细节。我在高层次上指出了语言问题,当你看代码的时候,你需要一个简单的回答:“这不是程序员明确使用的吗?”。您可以回答它,但是C++编译器不能,因为它只看到由语言定义的“使用”,它考虑析构函数,这与所提出的问题无关。
void slow() {
Timed t;
// heavy operation here...
}
void foo()
{
CWaitCursor cursor;
[...]
}