खोज…


वाक्य - विन्यास

  • [[विवरण]]: सरल नो-तर्क विशेषता

  • [[विवरण (तर्क))]: तर्क के साथ विशेषता

  • __attribute (विवरण): गैर-मानक GCC / Clang / IBM विशिष्ट

  • __declspec (विवरण): गैर-मानक MSVC विशिष्ट

[[वापसी नहीं]]

सी ++ 11

C ++ 11 ने [[noreturn]] विशेषता को पेश किया। इसका उपयोग किसी फ़ंक्शन के लिए यह इंगित करने के लिए किया जा सकता है कि फ़ंक्शन कॉलर को रिटर्न स्टेटमेंट निष्पादित करके वापस नहीं आता है, या अंत तक पहुंचकर अगर यह शरीर है (यह ध्यान रखना महत्वपूर्ण है कि यह void कार्यों पर लागू नहीं होता है, क्योंकि वे फोन करने वाले पर लौटें, वे अभी कोई मूल्य नहीं लौटाते)। इस तरह के एक समारोह को समाप्त करने के लिए std::terminate या std::exit , या एक अपवाद को फेंककर कॉल किया जा सकता है। यह भी ध्यान देने योग्य है कि इस तरह के एक फ़ंक्शन longjmp को निष्पादित करके वापस आ सकता है।

उदाहरण के लिए, नीचे दिया गया फ़ंक्शन हमेशा या तो एक अपवाद फेंक देगा या std::terminate , इसलिए यह [[noreturn]] लिए एक अच्छा उम्मीदवार है:

[[noreturn]] void ownAssertFailureHandler(std::string message) {
    std::cerr << message << std::endl;
    if (THROW_EXCEPTION_ON_ASSERT)
        throw AssertException(std::move(message));
    std::terminate();
}

इस तरह की कार्यक्षमता कंपाइलर को रिटर्न स्टेटमेंट के बिना किसी फ़ंक्शन को समाप्त करने की अनुमति देती है यदि यह जानता है कि कोड कभी निष्पादित नहीं होगा। यहाँ, क्योंकि नीचे दिए गए कोड में ownAssertFailureHandler (ऊपर परिभाषित) कॉल कभी नहीं लौटेगी, कंपाइलर को उस कॉल के नीचे कोड जोड़ने की आवश्यकता नहीं है:

std::vector<int> createSequence(int end) {
    if (end > 0) {
        std::vector<int> sequence;
        sequence.reserve(end+1);
        for (int i = 0; i <= end; ++i)
            sequence.push_back(i);
        return sequence;
    }
    ownAssertFailureHandler("Negative number passed to createSequence()"s);
    // return std::vector<int>{}; //< Not needed because of [[noreturn]]
}

यह अपरिभाषित व्यवहार है यदि फ़ंक्शन वास्तव में वापस आ जाएगा, तो निम्नलिखित की अनुमति नहीं है:

[[noreturn]] void assertPositive(int number) {
    if (number >= 0)
        return;
    else
        ownAssertFailureHandler("Positive number expected"s); //< [[noreturn]]
}

ध्यान दें कि [[noreturn]] का उपयोग ज्यादातर शून्य कार्यों में किया जाता है। हालांकि, यह एक आवश्यकता नहीं है, जिससे कार्यों को सामान्य प्रोग्रामिंग में उपयोग करने की अनुमति मिलती है:

template<class InconsistencyHandler>
double fortyTwoDivideBy(int i) {
    if (i == 0)
         i = InconsistencyHandler::correct(i);
    return 42. / i;
}

struct InconsistencyThrower {
    static [[noreturn]] int correct(int i) { ownAssertFailureHandler("Unknown inconsistency"s); }
}

struct InconsistencyChangeToOne {
    static int correct(int i) { return 1; }
}

double fortyTwo = fortyTwoDivideBy<InconsistencyChangeToOne>(0);
double unreachable = fortyTwoDivideBy<InconsistencyThrower>(0);

निम्न मानक लाइब्रेरी फ़ंक्शंस में यह विशेषता है:

  • std :: बीच में बंद करें
  • std :: बाहर निकलें
  • std :: quick_exit
  • std :: अप्रत्याशित
  • std :: समाप्त
  • std :: rethrow_exception
  • std :: throw_with_nested
  • std :: nested_exception :: rethrow_nested

[[असफल]]

सी ++ 17

जब भी एक switch में कोई case समाप्त होता है, तो अगले मामले का कोड निष्पादित हो जाएगा। इस अंतिम को statementbreak` स्टेटमेंट का उपयोग करके रोका जा सकता है। जैसा कि यह तथाकथित नीच व्यवहार बग का परिचय दे सकता है जब इरादा नहीं होता है, कई संकलक और स्थिर विश्लेषक इस पर चेतावनी देते हैं।

C ++ 17 से, एक मानक विशेषता यह दर्शाने के लिए शुरू की गई थी कि कोड के माध्यम से गिरने के लिए चेतावनी की आवश्यकता नहीं है। कंपाइलर्स सुरक्षित रूप से चेतावनी दे सकते हैं जब कोई मामला बिना break या [[fallthrough]] समाप्त हो जाता है और कम से कम एक बयान होता है।

switch(input) {
    case 2011:
    case 2014:
    case 2017:
        std::cout << "Using modern C++" << std::endl;
        [[fallthrough]]; // > No warning
    case 1998:
    case 2003:
        standard = input;
}

[[fallthrough]] अधिक विस्तृत उदाहरणों के लिए प्रस्ताव देखें।

[[पदावनत]] और [[पदावनत (कारण ")]]

सी ++ 14

C ++ 14 ने विशेषताओं के माध्यम से पदावनत कार्यों का एक मानक तरीका पेश किया। [[deprecated]] का उपयोग यह इंगित करने के लिए किया जा सकता है कि एक फ़ंक्शन को पदावनत किया गया है। [[deprecated("reason")]] एक विशिष्ट कारण को जोड़ने की अनुमति देता है जिसे संकलक द्वारा दिखाया जा सकता है।

void function(std::unique_ptr<A> &&a);

// Provides specific message which helps other programmers fixing there code
[[deprecated("Use the variant with unique_ptr instead, this function will be removed in the next release")]]
void function(std::auto_ptr<A> a);

// No message, will result in generic warning if called.
[[deprecated]]
void function(A *a);

यह विशेषता इस पर लागू हो सकती है:

  • एक वर्ग की घोषणा
  • एक टंकण-नाम
  • एक परिवर्तनीय
  • एक गैर-स्थैतिक डेटा सदस्य
  • एक समारोह
  • एक गणना
  • एक टेम्पलेट विशेषज्ञता

(रेफरी। c ++ 14 मानक मसौदा : 7.6.5 पदावनत विशेषता)

[[Nodiscard]]

सी ++ 17

[[nodiscard]] विशेषता का उपयोग यह इंगित करने के लिए किया जा सकता है कि जब आप फ़ंक्शन कॉल करते हैं, तो फ़ंक्शन के रिटर्न मान को अनदेखा नहीं किया जाना चाहिए। यदि रिटर्न मान को अनदेखा किया जाता है, तो संकलक को इस पर चेतावनी देनी चाहिए। विशेषता को इसमें जोड़ा जा सकता है:

  • एक फ़ंक्शन परिभाषा
  • एक प्रकार

विशेषता को एक प्रकार में जोड़ना उसी व्यवहार को कहते हैं जो हर एक फ़ंक्शन में विशेषता को जोड़ता है जो इस प्रकार को लौटाता है।

template<typename Function>
[[nodiscard]] Finally<std::decay_t<Function>> onExit(Function &&f);

void f(int &i) {
    assert(i == 0);                    // Just to make comments clear!
    ++i;                               // i == 1
    auto exit1 = onExit([&i]{ --i; }); // Reduce by 1 on exiting f()
    ++i;                               // i == 2
    onExit([&i]{ --i; });              // BUG: Reducing by 1 directly
                                       //      Compiler warning expected
    std::cout << i << std::end;        // Expected: 2, Real: 1
}

[[nodiscard]] अधिक विस्तृत उदाहरणों के लिए प्रस्ताव देखें।

नोट: Finally / onExit का कार्यान्वयन विवरण उदाहरण में छोड़ा गया है, अंत में देखें / ScopeExit

[[Maybe_unused]]

[[maybe_unused]] विशेषता कोड में यह संकेत करने के लिए बनाई गई है कि कुछ तर्क का उपयोग नहीं किया जा सकता है। यह अक्सर प्रीप्रोसेसर स्थितियों से जुड़ा होता है जहाँ इसका उपयोग किया जा सकता है या इसका उपयोग नहीं किया जा सकता है। जैसा कि संकलक अप्रयुक्त चर पर चेतावनी दे सकते हैं, यह इरादे का संकेत देकर उन्हें दबाने का एक तरीका है।

चर का एक विशिष्ट उदाहरण जो डिबग बिल्ड में आवश्यक होता है जबकि उत्पादन में अनावश्यक रूप से वापसी मान सफलता का संकेत देते हैं। डिबग बिल्ड में, शर्त को मुखर किया जाना चाहिए, हालांकि उत्पादन में इन एशर्ट को हटा दिया गया है।

[[maybe_unused]] auto mapInsertResult = configuration.emplace("LicenseInfo", stringifiedLicenseInfo);
assert(mapInsertResult.second); // We only get called during startup, so we can't be in the map

एक अधिक जटिल उदाहरण विभिन्न प्रकार के सहायक कार्य हैं जो एक अनाम नामस्थान में हैं। यदि संकलन के दौरान इन कार्यों का उपयोग नहीं किया जाता है, तो एक संकलक उन पर चेतावनी दे सकता है। आदर्श रूप से आप उन्हें कॉल करने वाले के रूप में एक ही प्रीप्रोसेसर टैग के साथ गार्ड करना चाहेंगे, हालांकि यह जटिल हो सकता है [[maybe_unused]] विशेषता अधिक अनुरक्षण विकल्प है।

namespace {
    [[maybe_unused]] std::string createWindowsConfigFilePath(const std::string &relativePath);
    // TODO: Reuse this on BSD, MAC ...
    [[maybe_unused]] std::string createLinuxConfigFilePath(const std::string &relativePath);
}

std::string createConfigFilePath(const std::string &relativePath) {
#if OS == "WINDOWS"
      return createWindowsConfigFilePath(relativePath);
#elif OS == "LINUX"
      return createLinuxConfigFilePath(relativePath);
#else
#error "OS is not yet supported"
#endif
}

कैसे [[maybe_unused]] पर अधिक विस्तृत उदाहरणों के लिए प्रस्ताव देखें।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow