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ć?
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ć?
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.
OK, ale jaki jest sens funkcji? Beacuse to dosłownie wszystko, co ta funkcja robi. –
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
@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
Ilekroć piszemy funkcję w C++, musimy podążać prototyp funkcji, tj
nazwa typu (parametr1, parametr2, ...) {instrukcje}
tutaj Type stoi na typ wartości zwraca
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 .
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.
Nie o to pyta OP. – anishsane
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.
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
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) {
}
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ć. –
Ponieważ zmienne są nieużywane, chcesz uniknąć ostrzeżenia . – Maroun
Jest to skomplikowany sposób wypowiedzenia 'void f (A *, B &, C *) {}'. – juanchopanza
Powinieneś podać więcej kontekstu. Co to jest oprogramowanie, w którym pojawia się ten kod? –