2015-06-30 30 views
5

當我使用下面的代碼執行一些操作1秒鐘時,我從Visual Studio中收到C4101警告:警告C4101:'highResClock':未引用的局部變量。我不明白爲什麼我在聲明它後使用highResClock兩次時會收到此警告。C++ 11時間未引用的本地變量

chrono::high_resolution_clock highResClock; 
chrono::duration<int, ratio<1, 1> > dur(1); 
chrono::time_point<chrono::high_resolution_clock> end = highResClock.now() + dur; 

while (highResClock.now() < end) 
{ 
    // do something repeatedly for 1 second 
} 

編輯:它看起來像從Visual Studio中的警告,是因爲性病::時辰:: high_resolution_clock ::現在()是一個靜態函數。儘管這是我選擇使用的特定方法,但現在()不需要highResClock變量。 Visual Studio似乎將此解釋爲不使用變量。當我用下面我不再得到任何警告:

chrono::duration<int, ratio<1, 1> > dur(1); 
chrono::time_point<chrono::high_resolution_clock> end = chrono::high_resolution_clock::now() + dur; 

while (chrono::high_resolution_clock::now() < end) 
{ 
    // do nothing 
} 
+6

備註:'std :: chrono :: high_resolution_clock :: now'是一個靜態函數,可以在沒有'std :: chrono :: high_resolution_clock'的情況下使用。我不知道爲什麼VS給你C4101,但這可能是源頭。 – Zeta

+1

FWIW,編譯無警告[在GCC/coliru](http://coliru.stacked-crooked.com/a/b543c37fe327fcff)。 –

+0

[''clang'與'-Weverything'一樣](http://coliru.stacked-crooked.com/a/198f8d25bf0093a) – Zeta

回答

7

您使用一個類的實例的靜態方法,它causes this warning

但是,也會發生這樣的警告時,通過類的一個實例調用靜態成員函數:

// C4101b.cpp 
// compile with: /W3 
struct S { 
    static int func() 
    { 
     return 1; 
    } 
}; 

int main() { 
    S si; // C4101, si is never used 
    int y = si.func(); 
    return y; 
} 

在這種情況下,編譯器將使用有關si訪問靜態函數,,但該類的實例不需要調用靜態函數;因此警告 [強調添加]。

MSDN文章還提供了額外信息,如何擺脫的警告:

要解決此警告,您可以:

  • 添加一個構造函數,在編譯器將在func的調用中使用si的實例。

  • func的定義中刪除static關鍵字。

  • 顯式調用靜態函數:int y = S::func();

由於您使用的是標準類,你應該訴諸於後者,例如std::chrono::high_resolution_clock::now()

auto end = std::chrono::high_resolution_clock::now() + std::chrono::seconds(1); 

while(std::chrono::high_resolution_clock::now() < end) 
{ 
    // do nothing 
} 

話雖這麼說,你不應該用一個忙循環等待,還有其他方法可以做到這一點(如條件變量,或std::this_thread::sleep_*)。