সি ++ 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)কোনও প্রয়োগে সতর্কতা এড়ানোর জন্য সাধারণভাবে আপনাকে স্ট্যান্ডার্ড লাইব্রেরি ফাংশনে যে কোনও কল ফেরত উপেক্ষা করতে কাস্ট ব্যবহার করতে হবে ।
জিসিসি 9.2.1, উবুন্টু 19.10 এ পরীক্ষিত।