संकलन समय पर जोर देने के लिए स्टैटिक एस्टर का उपयोग किया जाता है। जब स्थिर अभिकथन विफल हो जाता है, तो प्रोग्राम केवल संकलन नहीं करता है। , जैसे उदाहरण के लिए, यदि आप कुछ कार्यक्षमता कोड है कि गंभीर रूप से पर निर्भर करता है के द्वारा लागू इस, विभिन्न स्थितियों में उपयोगी है unsigned int
वास्तव में 32 बिट होने वस्तु। आप इस तरह से एक स्थिर मुखर डाल सकते हैं
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
आपके कोड में एक अन्य मंच पर, अलग-अलग आकार के unsigned int
प्रकार के साथ संकलन विफल हो जाएगा, इस प्रकार डेवलपर को कोड के समस्याग्रस्त हिस्से पर ध्यान आकर्षित करना और इसे फिर से लागू करने या फिर से निरीक्षण करने की सलाह देना।
एक और उदाहरण के लिए, आप void *
एक फ़ंक्शन (एक हैक, लेकिन कई बार उपयोगी) के लिए एक सूचक के रूप में कुछ अभिन्न मूल्य को पारित करना चाह सकते हैं और आप यह सुनिश्चित करना चाहते हैं कि अभिन्न मूल्य सूचक में फिट होगा
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
आप चाहते हैं कि उस char
प्रकार की संपत्ति पर हस्ताक्षर किए जाएं
static_assert(CHAR_MIN < 0);
या कि नकारात्मक मूल्यों के साथ अभिन्न विभाजन शून्य की ओर गोल है
static_assert(-5 / 2 == -2);
और इसी तरह।
कई मामलों में रन-टाइम अभिक्रियाओं का उपयोग स्थैतिक अभिकथनों के बजाय किया जा सकता है, लेकिन रन-टाइम दावे केवल रन-टाइम पर काम करते हैं और केवल तभी जब नियंत्रण अभिकथन पर गुजरता है। इस कारण से एक असफल रन-टाइम अभिकर्मक निष्क्रिय हो सकता है, विस्तारित अवधि के लिए अनिर्धारित।
बेशक, स्थैतिक अभिकथन में अभिव्यक्ति एक संकलन-समय स्थिर होना है। यह रन-टाइम मान नहीं हो सकता। रन-टाइम मान के लिए आपके पास कोई अन्य विकल्प नहीं है, लेकिन साधारण का उपयोग करें assert
।