2012-06-18 15 views
6

Powiel możliwe:
What does “(void) new” mean in C++?Co oznacza stwierdzenie "(void) startGuardBegin;" zrobić?

nie jestem zaznajomiony z C++ i nie rozumiem linię tuż po podpisaniu metoda:

int EAN13Reader::decodeMiddle(Ref<BitArray> row, 
     int startGuardBegin, 
     int startGuardEnd, 
     std::string& resultString) 
{ 
    (void)startGuardBegin; 
    ... 
} 

Co znajduje (void)startGuardBegin; ? Wywołanie metody?

+0

@ ThiefMaster Nie duplikowanie, nieco inne użycie 'void': odrzucanie wartości vs. oznaczanie zmiennej jako nieużywanej. –

+1

Nie duplikat. –

Odpowiedz

4

Informuje kompilator, że argument jest nieużywany i dlatego nie powinien wyświetlać ostrzeżenia "nieużywany argument".

Podczas gdy kompilatory takie jak GCC zwykle mają inne sposoby (int startGuardBegin __attribute__ ((unused))) na wskazanie tego, zwykle jakoś w nagłówku funkcji, odlewanie go do (void) nie opiera się na żadnych funkcjach specyficznych dla kompilatora.

3

Nic nie robi.

Zamiast tego podaje czytelnikowi i narzędziu do analizy statycznej, że startGuardBegin jest nieużywane w funkcji i że jest to prawidłowe i oczekiwane.

Narzędzia do analizy statycznej będą ostrzegać, jeśli parametr nie jest używany w funkcji, ponieważ wskazuje to na możliwy błąd. Jeśli parametru nie można usunąć z podpisu (jeśli jest używany w kodzie debugowania lub jest wymagany do zachowania kompatybilności lub zachowania w przyszłości), użycie tego parametru w instrukcji bez skutków zapobiegnie ostrzeżeniu. Jednak użycie go w oświadczeniu startGuardBegin; spowoduje wyświetlenie kolejnego ostrzeżenia (ponieważ wartość zostanie odrzucona), więc odrzucenie go do void zapobiega temu.

+0

Właściwie w większości przypadków jest to kompilator, a nie inne narzędzie do analizy statycznej. – ThiefMaster

1

Przesyłanie do void służy do blokowania ostrzeżeń kompilatora dotyczących nieużywanych zmiennych i niezapisanych wartości zwracanych lub wyrażeń.

Standard (2003) mówi w §5.2.9/4 mówi

Każda ekspresja może być bezpośrednio przekształcony do typu „CV void”. Wartość ekspresji jest odrzucono.

Więc można napisać (w C++ stylu sposób):

//suppressing unused variable warnings 
static_cast<void>(unusedVar); 

//suppressing return value warnings 
static_cast<void>(fn()); 

//suppressing unsaved expressions 
static_cast<void>(a + b * 10); 
static_cast<void>(x &&y || z);  
static_cast<void>(m | n + fn()); 

Wszystkie formy są poprawne. Zwykle robię to krócej jak:

//suppressing expressions 
(void)(unusedVar); 
(void)(fn()); 
(void)(x &&y || z); 

Jest również w porządku.