2013-04-16 14 views
8

Widzę to, gdy czytam kod źródłowy pugixml i naprawdę nie wiem, dlaczego on tam jest.Co robi "(void)! Ptr"?

void foo(void* ptr) { 
    (void)!ptr; // What does this line do? 
} 
+0

Wygląda na zamiennik za pozostawienie parametru bez nazwy. – chris

+2

Zwykle zatrzymuje kompilatory i inne narzędzia od narzekania na nieużywane parametry, stosując bezużyteczną operację. –

+0

Powiązane: [Nieużywany parametr w C++] (http://stackoverflow.com/questions/15763937/unused-parameter-in-c11) – hammar

Odpowiedz

10

(void)ptr; jest powszechnym sposobem aby tłumić „niewykorzystywane parametr” zasadami, które mogą być konieczne, gdy podpis funkcji muszą zawierać więcej parametrów niż zastosowań funkcyjnych (na przykład w zwrotnego, jeśli „danych użytkowych” parametr nie jest używany).

Jest dla mnie nowy, ale jest zbędny w tym kontekście, ponieważ wartość zwracana jest po prostu odrzucana.

+0

"!!" Prawdopodobnie wymusza operację, więc nie może po prostu odrzucić użycia. –

+4

Dla mnie wydaje się niepotrzebną paranoją. Odsunięcie do nieważności powoduje, że parametr "wydaje się" używany i każdy znany kompilator rozumie i unika emitowania nieużywanego ostrzeżenia o parametrach. – nneonneo

+0

'!' Zwraca również wartość 'bool'. Mogłoby to uniknąć ostrzeżenia "nie można rzucić wskaźnika do niecałkowitego" lub czegoś podobnego. Osobiście jestem zaskoczony, że możesz typować na "void" w ogóle. –