2015-02-26 15 views
5

Czekam na jakiś kod, który posiada funkcję, która wygląda tak:Co oznacza (void) w C++?

void f(A* a, B& b, C* c) 
{ 
    (void)a; 
    (void)b; 
    (void)c; 
} 

Co dokładnie działa (void) na początku każdej linii zrobić?

+1

Ponieważ zmienne są nieużywane, chcesz uniknąć ostrzeżenia . – Maroun

+5

Jest to skomplikowany sposób wypowiedzenia 'void f (A *, B &, C *) {}'. – juanchopanza

+0

Powinieneś podać więcej kontekstu. Co to jest oprogramowanie, w którym pojawia się ten kod? –

Odpowiedz

9

To, co widzisz, jest po prostu "sztuczką" do fałszywego użycia zmiennej/parametru.

Bez tych linii, pedantyczny kompilator ostrzega o zmiennych, które nie są używane.

Użycie konstruktora (void)variablename; spowoduje brak generowania instrukcji, ale kompilator uzna to za poprawne "użycie" tych zmiennych.

+0

OK, ale jaki jest sens funkcji? Beacuse to dosłownie wszystko, co ta funkcja robi. –

+1

Może to być skrót, a następnie ... Stworzony dla kompatybilności .. Główna funkcja kodowa funkcji 'f'. Dla określenia architektura xyz jest to zdefiniowane, dla architektury abcd jest ono zgaszone, jak pokazano. – anishsane

+1

@JesperEvertsson Nie ma sensu, a optymalizujący kompilator najprawdopodobniej całkowicie go rozłączy (tj. Nie wygeneruje dla niego żadnego kodu). Prawdopodobnie jest to element zastępczy dla czegoś, co ma zostać zaimplementowane, lub czegoś ze starszego. – Mario

-3

Ilekroć piszemy funkcję w C++, musimy podążać prototyp funkcji, tj

nazwa typu (parametr1, parametr2, ...) {instrukcje}

tutaj Type stoi na typ wartości zwraca

  1. Zwrot typu pustki umożliwia zdefiniowanie funkcji, która nie zwraca wartości. Zauważ, że to NIE jest to samo, co zwracanie 0. Wartość 0 jest typu integer, float, double, etc; to nie jest pustka. (W innych językach funkcja bez wartości zwracanej może być nazywana "podprocedurą" lub "procedurą", podczas gdy "funkcja" zawsze zwraca coś. W C/C++, wszystkie one są nazwane funkcjami.) powracająca pustka oznacza nie zwracanie niczego .

  2. Wskaźnik do pustego jest ogólnym wskaźnikiem, który może być używany, gdy typ danych w lokalizacji jest nieznany. Możesz więc użyć typu pustki *, aby odwołać się do adresu w pamięci, nie wiedząc, co faktycznie tam jest.

+3

Nie o to pyta OP. – anishsane

2

Widzę co najmniej dwa błędy. Pierwszym z nich jest uniknięcie ostrzeżeń kompilatora, że ​​zmienne są zdefiniowane, ale nie są używane w treści funkcji.

Po drugie, jest to bardzo stary kod i czasami programiści wypisują casting do unieważnienia przed wyrażeniami, jeśli wynik wyrażeń nie jest używany. Pomogło to kompilatorowi zoptymalizować wygenerowany kod obiektowy.

+0

Drugi akapit: To nie jest tylko bardzo stary kod. Nawet najnowsze wersje kompilatorów (np. GCC) będą narzekać, jeśli włączysz pedantyczne ostrzeżenia i nie użyjesz kodów powrotu niektórych funkcji bez rzutowania na "void". Chociaż szczerze mówiąc, to drugie użycie nie występuje w powyższym kodzie, co może być błędnym stwierdzeniem, na wypadek, gdyby którykolwiek z parametrów był wskaźnikiem funkcji. – Mario

3

To po prostu klud, aby uniknąć ostrzeżeń kompilatora. Na przykład, że kod będzie emitować

warning: unused parameter ‘a’ [-Wunused-parameter] 
warning: unused parameter ‘b’ [-Wunused-parameter] 
warning: unused parameter ‘c’ [-Wunused-parameter] 

gdy zestawiane z gcc -Wall -Wextra jeśli kludge nie jest używany. Istnieją jednak czystsze sposoby na osiągnięcie tego celu. Można pominąć nazwy parametrów:

void f(A*, B&, C*) { 
} 

gcc-SZCZEGÓLNE i nieco rozwlekły Alternatywą jest użycie atrybutu unused na każdej niewykorzystanej parametru:

void f(A* a __attribute__((unused)), B& b, C* c) { 
} 
+1

Innym sposobem na pozbycie się linii i uniknięcie ostrzeżenia, wystarczy usunąć nazwy z parametrów i wszystko jest ok: 'void f (A *, B &, C *) {}' <- Brak zmiennych, na które można narzekać. –