w następującej funkcjiCo to jest wyrażenie instrukcji rzutowania w C?
int f (some_struct* p)
{
(void) p;
/* something else */
return 0;
}
co to oświadczenie
(void) p;
oznacza?
w następującej funkcjiCo to jest wyrażenie instrukcji rzutowania w C?
int f (some_struct* p)
{
(void) p;
/* something else */
return 0;
}
co to oświadczenie
(void) p;
oznacza?
Instrukcja nie wykonuje żadnych czynności w czasie wykonywania i nie powoduje wygenerowania kodu maszyny.
Wyklucza ostrzeżenie kompilatora, że p
nie jest używane w treści tej funkcji. Jest to przenośny i bezpieczny sposób na powstrzymanie tego ostrzeżenia dla wielu różnych kompilatorów, w tym GCC, Clang i Visual C++.
"Obsada do void
" jest idiomem języka C, który, zgodnie z konwencją, pomija kompilator i ostrzeżenia o nieużywanych zmiennych lub zwracanych wartościach.
W tym przypadku, jak słusznie zauważa Dietrich Epp, informuje kompilator, że wiesz, że nie używasz argumentu p
, i nie daje ci ostrzeżeń o "nieużywanym argumencie".
Drugi wykorzystanie tego idiomu, rzucając wartości zwracanej przez funkcję do void
, jest tradycyjnym sposobem mówienia lint
lub, co ważniejsze, inni programiści, które którą podjął świadomą decyzję, aby nie niepokoić sprawdzanie wartości zwracanej funkcji. Na przykład:
(void)printf("foo")
Co oznacza „wiem printf()
zwraca wartość, a ja naprawdę powinien to sprawdzić, ale zdecydowaliśmy się nie przeszkadza”.
Służy do uniknięcia ostrzeżenia o nieużywanym parametrze funkcji. Po prostu zostaje odrzucony, nie robi nic poza tym, że wyrażenie ma efekt uboczny.
C11 §6.3.2.2 void
Wartość (nieistniejący) o void wyrażenia (wyrażenie, które ma typ void) nie stosuje się w żaden sposób, a bezpośrednia lub pośrednia konwersje (z wyjątkiem nieważności) nie będą stosowane do takiego wyrażenia. Jeśli wyrażenie dowolnego innego typu zostanie ocenione jako wyrażenie pustki , jego wartość lub oznaczenie zostaną odrzucone. (A. Void wyrażenie jest oceniany pod kątem jego skutków ubocznych)
Innym sposobem na uniknięcie ostrzeżenie niewykorzystanych parametrem funkcji jest następująca:
p = p;
void
informuje kompilator lub kłaczki nie dać ostrzeżenie . Jeśli istnieje zmienna, której nigdy nie użyjesz, kompilator lub lint zaproponuje jej usunięcie.
Jeśli nie chcesz go usuwać, możesz użyć pustki. Podobny link: How can I hide "defined but not used" warnings in GCC?
Czy oznacza to, że "void" jest jedynym typem, który można tam umieścić? – user693986
Jeśli wstawisz tam inny typ, niektóre kompilatory wygenerują ostrzeżenie "bez użycia efektu".Jeśli umieścisz 'void' w tym miejscu, komunikujesz zarówno kompilator, jak i ludziom, czytając kod, o którym wiesz, że instrukcja nie ma żadnego skutku, i masz się z tym dobrze. Ponadto każdy typ może być rzutowany na 'void' w C (w C++ historia jest inna). –