首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >g++不显示“未使用”警告

g++不显示“未使用”警告
EN

Stack Overflow用户
提问于 2011-03-15 02:36:43
回答 3查看 2K关注 0票数 27

我在C++中有一小段代码:

代码语言:javascript
复制
#include <iostream>
#include <iterator>
#include <string>

using namespace std;

int main() {

    int i=0;
    istream_iterator<string> EOS;
    double x;

    return 0;
}

现在我用我的g++ (GCC) 4.4.4编译它

代码语言:javascript
复制
g++ -W -Wall -pedantic test.cc -o test

并获取:

代码语言:javascript
复制
test.cc: In function 'int main()':
test.cc:9: warning: unused variable 'i'
test.cc:11: warning: unused variable 'x'

为什么对未使用的EOS没有警告?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-15 02:38:04

它不是一个原始值,因此它的构造函数和/或析构函数可能具有所需的副作用。

为了说明这在实践中发生的情况:我使用一个类对代码段进行计时,大致如下所示:

代码语言:javascript
复制
class Timed {
    double start;
    public:
        Timed() { start = now(); }
        ~Timed() { std::cout << (now() - start) << '\n'; }
}

因此,为了测量一个函数需要多长时间,我简单地这样做:

代码语言:javascript
复制
void slow() {
    Timed t;
    // heavy operation here...
}

变量t永远不会被使用,但它对代码的行为仍然很重要。

票数 38
EN

Stack Overflow用户

发布于 2011-03-15 02:38:25

istream_iterator<string>有一个构造函数,所以EOS的声明并不像ix的声明那样是一个真正的无操作。

通常,您希望声明一个类类型的对象,然后不对其执行任何操作。例如,考虑C++0x中的std::lock_guard (Boost中的boost::scoped_lock)或任何其他类型的范围保护类。你通常不想对这种类型的对象做任何事情,你只想创建对象,以便它的析构函数在块的末尾运行,以执行任何需要执行的清理。

票数 7
EN

Stack Overflow用户

发布于 2011-03-15 02:39:28

因为你可以有目的地这么做。它不是一个原语。也许构造函数和析构函数做了一些重要的事情?

MFC甚至有这样操作的类,你可以这样做:

代码语言:javascript
复制
void foo()
{
    CWaitCursor cursor;

    [...]
}

这将在函数的持续时间内显示一个沙漏图标。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5302848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档