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
[[nodiscard]] int f() {
return 1;
}
int main() {
f();
}
menyusun:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -o main.out main.cpp
hasil:
main.cpp: In function ‘int main()’:
main.cpp:6:6: warning: ignoring return value of ‘int f()’, declared with attribute nodiscard [-Wunused-result]
6 | f();
| ~^~
main.cpp:1:19: note: declared here
1 | [[nodiscard]] int f() {
|
Berikut semua hindari peringatan:
(void)f();
[[maybe_unused]] int i = f();
Saya tidak dapat menggunakan maybe_unused
langsung pada f()
panggilan:
[[maybe_unused]] f();
memberikan:
main.cpp: In function ‘int main()’:
main.cpp:6:5: warning: attributes at the beginning of statement are ignored [-Wattributes]
6 | [[maybe_unused]] f();
| ^~~~~~~~~~~~~~~~
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
:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -Wno-unused-result -o main.out main.cpp
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/nodiscard
GCC warn_unused_result
Atribut
Sebelum standarisasi [[nodiscard]]
, dan untuk C sebelum mereka akhirnya memutuskan untuk menstandarkan atribut, GCC mengimplementasikan fungsi yang sama persis dengan warn_unused_result
:
int f() __attribute__ ((warn_unused_result));
int f() {
return 1;
}
int main() {
f();
}
pemberian yang mana:
main.cpp: In function ‘int main()’:
main.cpp:8:6: warning: ignoring return value of ‘int f()’, declared with attribute warn_unused_result [-Wunused-result]
8 | f();
| ~^~
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.