int fn();
void whatever()
{
(void) fn();
}
Czy istnieje jakiś powód, aby rzutować nieużywaną wartość zwracaną na void, czy też mam rację, myśląc, że to kompletna strata czasu?
Zagryźć:
Cóż, wydaje się to dość wyczerpujące. Przypuszczam, że jest to lepsze niż komentowanie nieużywanej wartości zwracanej, ponieważ samodokumentujący kod jest lepszy niż komentarze. Osobiście wyłączę te ostrzeżenia, ponieważ jest to niepotrzebny hałas.
Zjem moje słowa, jeśli z tego powodu ucieknie błąd ...
W pracy używamy tego do uznania, że funkcja ma wartość zwracaną, ale programista zapewnił, że można ją bezpiecznie zignorować. Ponieważ oznaczyłeś pytanie jako C ++, powinieneś używać static_cast :
Jeśli chodzi o kompilator, rzutowanie zwracanej wartości na void ma niewielkie znaczenie.
źródło
Prawdziwy powód takiego działania sięga narzędzia używanego w kodzie C, zwanego lint .
Analizuje kod pod kątem możliwych problemów oraz wydaje ostrzeżenia i sugestie. Gdyby funkcja zwróciła wartość, która nie została następnie sprawdzona,
lint
ostrzegałaby, gdyby było to przypadkowe. Aby uciszyćlint
to ostrzeżenie, rzucasz wezwanie do(void)
.źródło
Rzutowanie na
void
służy do pomijania ostrzeżeń kompilatora dla nieużywanych zmiennych i niezapisanych zwracanych wartości lub wyrażeń.Standard (2003) mówi w §5.2.9 / 4 mówi:
Możesz więc napisać:
Wszystkie formularze są ważne. Zwykle skracam go jako:
To też jest w porządku.
źródło
Od c ++ 17 mamy
[[maybe_unused]]
atrybut, którego można użyć zamiastvoid
rzutowania.źródło
nodiscard
który może być interesujący: stackoverflow.com/a/61675726/895245 Również myślę, że nie możesz zastosować[[maybe_unused]]
bezpośrednio do wywołania, jak się wydaje, tylko do fałszywej zmiennej, która akceptuje zwrot wywołania? Jeśli to prawda, jest trochę niepewne.Rzucanie w pustkę jest darmowe. Jest to tylko informacja dla kompilatora, jak go traktować.
źródło
(void)
kosztuje mnie czas i energię i sprawia, że zastanawiam się, czy autor wiedział, jak działają wyrażenia.Ponieważ funkcja rzutowania programu na void jest bez znaczenia. Twierdzę również, że nie należy go używać do sygnalizowania czegoś osobie, która czyta kod, jak sugeruje David w odpowiedzi. Jeśli chcesz przekazać coś o swoich zamiarach, lepiej użyć komentarza. Dodanie takiej obsady będzie wyglądać dziwnie i wywoła pytania o możliwy powód. Tylko moja opinia...
źródło
For the functionality of you program casting to void is meaningless
Jeśli chodzi o samokontrolę i liczbę ostrzeżeń podczas kompilacji, tak naprawdę nie jest.you should not use it to signal something to the person that is reading the code [...] it is better to use a comment.
Najlepszym komentarzem jest brak komentarza , gdy kod sam się wyjaśnia. I znowu utrzymuje poprawny kompilator ostrzeżeń w tym procesie.Również podczas weryfikacji kodu zgodnego ze standardami MISTA (lub innymi), automatyczne narzędzia, takie jak LDRA, nie pozwolą Ci wywołać funkcji, która ma typ zwracany bez zwracania przez nią wartości, chyba że jawnie rzutujesz zwróconą wartość na (void)
źródło
C ++ 17
[[nodiscard]]
C ++ 17 ustandaryzował „zwracaną wartość biznesową ignorowaną” za pomocą atrybutu.
Dlatego mam nadzieję, że zgodne implementacje zawsze będą ostrzegać tylko wtedy, gdy
nodiscard
zostaną podane, i nigdy nie będą ostrzegać inaczej.Przykład:
main.cpp
skompilować:
wynik:
Poniższe wszystkie pozwalają uniknąć ostrzeżenia:
Nie mogłem użyć
maybe_unused
bezpośrednio podczasf()
rozmowy:daje:
Działanie
(void)
rzutowania nie wydaje się być obowiązkowe, ale standard jest „ zalecany ”: Jak celowo odrzucić wartość zwracaną przez [[nodiscard]]?Jak widać z komunikatu ostrzegawczego, jednym „rozwiązaniem” ostrzeżenia jest dodanie
-Wno-unused-result
:chociaż oczywiście nie polecałbym ignorowania takich ostrzeżeń na całym świecie.
C ++ 20 pozwala również dodać powód do
nodiscard
jak w,[[nodiscard("reason")]]
jak wspomniano na: https://en.cppreference.com/w/cpp/language/attributes/nodiscardwarn_unused_result
Atrybut GCCPrzed standaryzacją
[[nodiscard]]
i dla C zanim ostatecznie zdecydują się na standaryzację atrybutów, GCC zaimplementowało dokładnie tę samą funkcjonalność zwarn_unused_result
:co daje:
Należy zatem zauważyć, że ponieważ ANSI C nie ma na to standardu, ANSI C nie określa, które funkcje biblioteki standardowej C mają atrybut lub nie, a zatem implementacje podjęły własne decyzje dotyczące tego, co powinno lub nie być oznaczone
warn_unuesd_result
, co dlatego generalnie należałoby użyć(void)
rzutowania, aby zignorować zwrot wszelkich wywołań funkcji biblioteki standardowej, aby w pełni uniknąć ostrzeżeń w jakiejkolwiek implementacji.Przetestowano w GCC 9.2.1, Ubuntu 19.10.
źródło