सी ++ 17 [[nodiscard]]
सी ++ 17 ने एक विशेषता के साथ "वापसी मूल्य की अनदेखी व्यापार" को मानकीकृत किया।
इसलिए, मुझे आशा है कि अनुपालन कार्यान्वयन हमेशा तभी चेतावनी देंगे जब nodiscard
दिया दिया जाएगा, और अन्यथा कभी भी चेतावनी नहीं दी जाएगी।
उदाहरण:
main.cpp
[[nodiscard]] int f() {
return 1;
}
int main() {
f();
}
संकलन:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -o main.out main.cpp
परिणाम:
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() {
|
निम्नलिखित सभी चेतावनी से बचें:
(void)f();
[[maybe_unused]] int i = f();
मैं maybe_unused
सीधे f()
कॉल पर उपयोग करने में सक्षम नहीं था :
[[maybe_unused]] f();
देता है:
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)
डाली काम कर अनिवार्य होना प्रतीत नहीं होता है, लेकिन "प्रोत्साहित" है मानक में: कैसे मैं जानबूझकर एक [[nodiscard]] वापसी मान त्यागने कर सकते हैं?
चेतावनी संदेश से भी देखा जा सकता है, चेतावनी के लिए एक "समाधान" जोड़ना है -Wno-unused-result
:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -Wno-unused-result -o main.out main.cpp
हालांकि मैं निश्चित रूप से इस तरह से विश्व स्तर पर चेतावनियों को नजरअंदाज करने की सलाह नहीं देता।
सी ++ 20 भी आप के लिए एक कारण जोड़ने की अनुमति देता nodiscard
में के रूप में [[nodiscard("reason")]]
के रूप में उल्लेख किया https://en.cppreference.com/w/cpp/language/attributes/nodiscard
जीसीसी warn_unused_result
विशेषता
के मानकीकरण से पहले [[nodiscard]]
, और सी के लिए इससे पहले कि वे अंततः विशेषताओं को मानकीकृत करने का निर्णय लेते हैं, जीसीसी ने ठीक उसी कार्यक्षमता के साथ लागू किया warn_unused_result
:
int f() __attribute__ ((warn_unused_result));
int f() {
return 1;
}
int main() {
f();
}
जो देता है:
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();
| ~^~
तब यह ध्यान दिया जाना चाहिए कि चूंकि एएनएसआई सी के पास इसके लिए कोई मानक नहीं है, एएनएसआई सी यह निर्दिष्ट नहीं करता है कि सी मानक पुस्तकालय कार्यों में कौन सी विशेषता है या नहीं और इसलिए कार्यान्वयन ने अपने स्वयं के निर्णय किए हैं कि क्या होना चाहिए या नहीं के साथ चिह्नित किया जाना चाहिए warn_unuesd_result
, जो यही कारण है कि सामान्य तौर पर आपको (void)
किसी भी कार्यान्वयन में चेतावनी से पूरी तरह से बचने के लिए मानक पुस्तकालय कार्यों के लिए किसी भी कॉल के रिटर्न को अनदेखा करने के लिए कलाकारों का उपयोग करना होगा ।
GCC 9.2.1, उबंटू 19.10 में परीक्षण किया गया।