2015-06-30 15 views
5

Kiedy używam następującego kodu, aby wykonać jakąś akcję przez 1 sekundę, otrzymuję ostrzeżenie C4101 od Visual Studio: ostrzeżenie C4101: "highResClock": niepowiązana zmienna lokalna. Nie rozumiem, dlaczego otrzymuję to ostrzeżenie, gdy używam highResClock dwa razy po zadeklarowaniu go.C++ 11 zmienna lokalna bez odniesienia

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 
} 

Edit: Wygląda na to ostrzeżenie z Visual Studio jest ponieważ std :: Chrono :: high_resolution_clock :: teraz() jest funkcją statycznego. Zmienna highResClock nie była potrzebna, aby uzyskać dostęp teraz(), mimo że jest to konkretna metoda, którą wybrałem. Visual Studio wydaje się interpretować to jako niestosowanie zmiennej. Kiedy należy stosować następujące już nie dostać żadnych ostrzeżeń:

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

Uwaga: 'std :: chrono :: high_resolution_clock :: now' jest statyczną funkcją i może być używany bez instancji' std :: chrono :: high_resolution_clock'. Nie wiem, dlaczego VS daje ci C4101, ale to może być źródło. – Zeta

+1

FWIW, kompiluje ostrzeżenie [na GCC/coliru] (http://coliru.stacked-crooked.com/a/b543c37fe327fcff). –

+0

To samo dotyczy ['clang' z' -Weverything'] (http://coliru.stacked-crooked.com/a/198f8d25bf0093a) – Zeta

Odpowiedz

7

Używasz statyczne metody na instancji klasy, która causes this warning:

Jednak to ostrzeżenie będzie również wystąpić, gdy wywołanie funkcji składowej statycznej za pośrednictwem instancji klasy:

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

W tej sytuacji, kompilator używa informacji o si aby uzyskać dostęp do funkcji statycznej, , ale instancja klasy nie jest potrzebna do wywołania funkcji statycznej; stąd ostrzeżenie [podkreślenia dodano].

W artykule MSDN zapewnia również dodatkowe informacje, w jaki sposób pozbyć się ostrzeżenie:

Aby rozwiązać to ostrzeżenie, można:

  • Dodaj konstruktor, w którym kompilator użyłby instancji si w wywołaniu func.

  • Usuń słowo kluczowe static z definicji func.

  • Wywołanie funkcji statycznej jawnie: int y = S::func();.

Ponieważ używasz standardowego klasę, należy odwołać się do tego ostatniego, np 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 
} 

Mając na uwadze powyższe, nie należy korzystać z ruchliwej pętli czekać, istnieją inne sposoby, aby to zrobić (na przykład zmienne stanu lub std::this_thread::sleep_*).

Powiązane problemy