int fn();
void whatever()
{
(void) fn();
}
Apakah ada alasan untuk membuang nilai pengembalian yang tidak terpakai, atau apakah saya benar berpikir itu hanya membuang-buang waktu?
Mengikuti:
Sepertinya itu cukup komprehensif. Saya kira itu lebih baik daripada mengomentari nilai kembali yang tidak digunakan karena kode yang mendokumentasikan diri lebih baik daripada komentar. Secara pribadi, saya akan mematikan peringatan ini karena itu suara yang tidak perlu.
Aku akan makan kata-kataku jika serangga lolos karenanya ...
Di tempat kerja kami menggunakannya untuk mengetahui bahwa fungsi tersebut memiliki nilai kembali tetapi pengembang telah menegaskan bahwa aman untuk mengabaikannya. Karena Anda menandai pertanyaan sebagai C ++, Anda harus menggunakan static_cast :
Sejauh kompiler pergi mentransmisikan nilai kembali ke void memiliki sedikit arti.
sumber
Alasan sebenarnya untuk melakukan ini berasal dari alat yang digunakan pada kode C, yang disebut lint .
Ini menganalisis kode untuk mencari kemungkinan masalah dan mengeluarkan peringatan dan saran. Jika suatu fungsi mengembalikan nilai yang kemudian tidak diperiksa,
lint
akan memperingatkan jika ini tidak disengaja. Untuk menonaktifkanlint
peringatan ini, Anda melakukan panggilan ke(void)
.sumber
Mentransmisikan ke
void
digunakan untuk menyembunyikan peringatan compiler untuk variabel yang tidak digunakan dan nilai atau ekspresi yang dikembalikan yang belum disimpan.The Standard (2003) mengatakan dalam §5.2.9 / 4 mengatakan,
Jadi Anda bisa menulis:
Semua formulir valid. Saya biasanya membuatnya lebih pendek seperti:
Ini juga oke.
sumber
Sejak c ++ 17 kami memiliki
[[maybe_unused]]
atribut yang dapat digunakan sebagai penggantivoid
cast.sumber
nodiscard
yang mungkin menarik: stackoverflow.com/a/61675726/895245 Juga saya pikir Anda tidak dapat menerapkan[[maybe_unused]]
secara langsung ke panggilan tampaknya, hanya untuk variabel dummy yang menerima kembalinya panggilan? Jika itu benar, itu agak miring.Transmisi ke void tidak memerlukan biaya. Ini hanya informasi untuk kompilator bagaimana memperlakukannya.
sumber
(void)
menghabiskan waktu dan energi saya dan membuat saya bertanya-tanya apakah penulis tahu bagaimana ekspresi bekerja.Untuk fungsionalitas program Anda, casting to void tidak ada artinya. Saya juga berpendapat bahwa Anda tidak boleh menggunakannya untuk memberi isyarat kepada orang yang membaca kode tersebut, seperti yang disarankan dalam jawaban David. Jika Anda ingin mengkomunikasikan sesuatu tentang niat Anda, lebih baik menggunakan komentar. Menambahkan pemeran seperti ini hanya akan terlihat aneh dan menimbulkan pertanyaan tentang kemungkinan alasannya. Hanya pendapat saya ...
sumber
For the functionality of you program casting to void is meaningless
Untuk dokumentasi mandiri dan jumlah peringatan saat mengompilasi, sebenarnya tidak.you should not use it to signal something to the person that is reading the code [...] it is better to use a comment.
Komentar terbaik adalah tidak ada komentar , saat kode menjelaskan dirinya sendiri. Dan, sekali lagi, membuat compiler peringatan valid tetap senang dalam prosesnya.Juga saat memverifikasi kode Anda sesuai dengan standar MISTA (atau lainnya), alat otomatis seperti LDRA tidak akan mengizinkan Anda memanggil fungsi yang memiliki tipe kembalian tanpa membuatnya mengembalikan nilai kecuali Anda secara eksplisit memasukkan nilai yang dikembalikan ke (void)
sumber
C ++ 17
[[nodiscard]]
C ++ 17 menstandarkan "bisnis yang diabaikan nilai pengembaliannya" dengan atribut.
Oleh karena itu, saya berharap penerapan yang sesuai akan selalu memberi peringatan hanya jika
nodiscard
diberikan, dan tidak pernah memperingatkan sebaliknya.Contoh:
main.cpp
menyusun:
hasil:
Berikut semua hindari peringatan:
Saya tidak dapat menggunakan
maybe_unused
langsung padaf()
panggilan:memberikan:
Pekerjaan
(void)
pemeran tampaknya tidak wajib tetapi "didorong" dalam standar: Bagaimana saya bisa dengan sengaja membuang nilai kembalian [[nodiscard]]?Juga terlihat dari pesan peringatan, salah satu "solusi" untuk peringatan tersebut adalah dengan menambahkan
-Wno-unused-result
:meskipun saya tentu saja tidak akan merekomendasikan mengabaikan peringatan secara global seperti ini.
C ++ 20 juga memungkinkan Anda untuk menambahkan alasan untuk
nodiscard
seperti dalam[[nodiscard("reason")]]
seperti yang disebutkan di: https://en.cppreference.com/w/cpp/language/attributes/nodiscardGCC
warn_unused_result
AtributSebelum standarisasi
[[nodiscard]]
, dan untuk C sebelum mereka akhirnya memutuskan untuk menstandarkan atribut, GCC mengimplementasikan fungsi yang sama persis denganwarn_unused_result
:pemberian yang mana:
Perlu dicatat kemudian bahwa karena ANSI C tidak memiliki standar untuk ini, ANSI C tidak menentukan fungsi perpustakaan standar C mana yang memiliki atribut atau tidak dan oleh karena itu implementasi telah membuat keputusan sendiri tentang apa yang harus atau tidak ditandai dengan
warn_unuesd_result
, yang mana itulah sebabnya secara umum Anda harus menggunakan(void)
cast untuk mengabaikan pengembalian panggilan apa pun ke fungsi library standar untuk sepenuhnya menghindari peringatan dalam implementasi apa pun.Diuji di GCC 9.2.1, Ubuntu 19.10.
sumber