C ++ 17 [[nodiscard]]
C ++ 17, bir öznitelikle "geri dönüş değeri göz ardı edilen işi" standardize etti.
Bu nedenle, uyumlu uygulamaların her zaman yalnızca nodiscard
verildiğinde uyaracağını, aksi takdirde asla uyarmayacağını .
Misal:
main.cpp
[[nodiscard]] int f() {
return 1;
}
int main() {
f();
}
derlemek:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -o main.out main.cpp
sonuç:
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() {
|
Aşağıdakilerin tümü uyarıdan kaçınır:
(void)f();
[[maybe_unused]] int i = f();
Kullanamadım maybe_unused
Doğrudan f()
görüşmede :
[[maybe_unused]] f();
verir:
main.cpp: In function ‘int main()’:
main.cpp:6:5: warning: attributes at the beginning of statement are ignored [-Wattributes]
6 | [[maybe_unused]] f();
| ^~~~~~~~~~~~~~~~
(void)
Dökme çalışma standart zorunlu olduğu görünmüyor ama "teşvik" olduğunu: Ben kasıtlı bir [[nodiscard]] dönüş değeri göz ardı nasıl?
Ayrıca uyarı mesajından da görüldüğü gibi, uyarıya bir "çözüm" eklemektir -Wno-unused-result
:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -Wno-unused-result -o main.out main.cpp
elbette bunun gibi küresel çapta uyarıları görmezden gelmenizi tavsiye etmem.
C ++ 20 ayrıca aşağıdaki adreste belirtildiği nodiscard
gibi bir neden eklemenizi sağlar [[nodiscard("reason")]]
: https://en.cppreference.com/w/cpp/language/attributes/nodiscard
GCC warn_unused_result
özelliği
Standartlaştırılmadan önce [[nodiscard]]
ve C için nitelikleri standartlaştırmaya karar vermeden önce, GCC aşağıdakilerle tam olarak aynı işlevselliği uyguladı warn_unused_result
:
int f() __attribute__ ((warn_unused_result));
int f() {
return 1;
}
int main() {
f();
}
hangi verir:
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();
| ~^~
ANSI C Bunun için bir standart olmadığı için, ANSI C C standart kütüphanesi fonksiyonları özniteliği ya da değil ve bu nedenle tüm uygulamaları veya işaretlenmiş edilmemelidir ne kendi kararlarını yapmış hangi belirtmez o zaman unutulmamalıdır warn_unuesd_result
, hangi bu nedenle genel olarak(void)
, herhangi bir uygulamada uyarılardan tamamen kaçınmak için standart kütüphane işlevlerine yapılan herhangi bir çağrının geri dönüşünü yok saymak için çevirmeyi .
GCC 9.2.1, Ubuntu 19.10'da test edilmiştir.