W jakimś projekcie C widziałem ten kod:
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
(void)ud;
(void)osize;
/* some code not using `ud` or `osize` */
return ptr;
}
Czy te dwa rzuty, które mają zostać unieważnione, służą jakimkolwiek celom?
(void)
do nieco innego efektu. To pytanie dotyczy COdpowiedzi:
Ma to na celu uniknięcie ostrzeżeń ze strony kompilatora, ponieważ niektóre parametry są nieużywane.
źródło
Powodem posiadania nieużywanych parametrów w prototypie jest zwykle to, że funkcja musi być zgodna z jakimś zewnętrznym API - być może jest to funkcja biblioteczna lub wskaźnik do tej funkcji jest przekazywany do innej funkcji, która oczekuje takiej konwencji wywoływania. Jednak nie wszystkie argumenty używane przez konwencję wywoływania są w rzeczywistości potrzebne w samej funkcji.
Powodem podania nazwy parametru w treści jest uniknięcie ostrzeżeń, takich jak
To ostrzeżenie można wyeliminować, używając rzeczywistego parametru w treści funkcji. Na przykład, jeśli masz następujące oświadczenie:
To ostrzeżenie jest teraz zniesione. Jednak teraz GCC wyświetli kolejne ostrzeżenie:
To ostrzeżenie mówi, że instrukcja
ud;
, chociaż jest poprawna składniowo w C, w ogóle nie wpływa na nic i prawdopodobnie jest błędem, podobnie jak instrukcjaktóre być może powinno być napisane jako
abort();
zamiast tego, żeby coś zrobiło.I w tym miejscu
(void)
pojawia się rzutowanie - powie kompilatorowi jednoznacznie i wyraźnie, że instrukcja ma absolutnie nie mieć żadnego efektu.źródło