簡體   English   中英

g ++不顯示“未使用”警告

[英]g++ does not show a 'unused' warning

我在C ++中有一些代碼:

#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編譯它

g++ -W -Wall -pedantic test.cc -o test

得到:

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'; }
}

因此,要衡量一個函數需要多長時間,我只需執行以下操作:

void slow() {
    Timed t;
    // heavy operation here...
}

變量t永遠不會被使用,但是它對於代碼的行為仍然很重要。

istream_iterator<string>具有構造函數,因此EOS的聲明並非像ix的聲明那樣真正地無操作。

通常,您想聲明一個類類型的對象,然后對其不執行任何操作。 例如,考慮C ++ 0x中的std::lock_guard (Boost中的boost::scoped_lock )或任何其他種類的范圍保護類。 您通常不需要對這種對象做任何事情,只想創建一個對象,以便其析構函數在塊的末尾運行以執行需要執行的任何清理操作。

因為您可以有目的地做到這一點。 這不是原始的。 也許構造函數和析構函數做一些重要的事情?

MFC甚至具有以這種方式操作的類,您可以這樣做:

void foo()
{
    CWaitCursor cursor;

    [...]
}

這將在功能持續時間內顯示一個沙漏圖標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM