मेरा कोड इस तरह के कंपाइलर आवेषणों का व्यापक उपयोग करता है ताकि रन टाइम पर प्राथमिकता में निर्माण समय पर त्रुटियों को ध्वजांकित किया जा सके और रन टाइम पर आवेदकों को निष्पादित न करके प्रदर्शन में सुधार किया जा सके।सी कंपाइलर आवेषण: अभिव्यक्ति तय होने पर गतिशील रूप से उनका उपयोग कैसे करें?
#define COMPILER_ASSERT(EXPR) switch (0) {case 0: case (EXPR):;}
सभी अच्छे। मैं निम्नलिखित मामले के लिए कंपाइलर आवेषण का उपयोग करने के लिए इसे विस्तारित करना चाहता हूं। मान लें कि मेरे पास एक मैक्रो है जिसे 100 स्थानों से बुलाया जाता है, जिनमें से 99 एक निश्चित मान पास करते हैं, जिनमें से 1 एक चर को पास करता है। मैं मैक्रो को 99 स्थानों में एक कंपाइलर जोर देने और आखिरी में एक रनटाइम जोर देने के लिए कैसे कोड कर सकता हूं।
यदि मैं गारंटी दे सकता हूं कि MY_FUNCTION() को हमेशा एक निश्चित मान के साथ बुलाया गया था, तो मैं इसे इस तरह कोड कर सकता था।
void my_function(int x)
{
//do something
}
#define MY_FUNCTION(X) \
COMPILER_ASSERT(X != 0); \
my_function(X)
//These can all take advantage of a compiler assert.
MY_FUNCTION(1);
MY_FUNCTION(SOME_HASH_DEFINE);
MY_FUNCTION(sizeof(SOME_STRUCTURE));
//This can't (this is a contrived example - actual code is complex).
int some_variable = 1;
MY_FUNCTION(some_variable);
तो, अगर मैं गारंटी नहीं दे सकते कि एक्स तय हो गई है, लेकिन MY_FUNCTION की प्रत्येक कॉल के लाभ लेना चाहते हैं() कहां है, मैं इसे कैसे कोड करते हैं? कुछ ऐसा:
#define MY_FUNCTION(X) \
if (X is a fixed value) COMPILER_ASSERT(X != 0); \
else assert(X != 0); \
my_function(X)
केवल My_FUNCTION() को कॉल को रिकोड करने के लिए केवल निश्चित मान पास करने के लिए मेरे लिए एक विकल्प नहीं है। हां, मैं MY_FUNCTION_FIXED_X और MY_FUNCTION_VARIABLE_X को परिभाषित कर सकता हूं लेकिन यह सब कॉलिंग कोड पर इसका खुलासा करता है।
आपकी मदद के लिए धन्यवाद। NickB
शायद आप सी 11 का उपयोग कर सकते हैं, जिसमें वास्तविक संकलन-समय का दावा है? –
जब आप तय कहते हैं, तो क्या आपका मतलब समय स्थिरता है? यदि हां, तो मुझे लगता है कि क्लाइंट कोड में 99 कॉल में मूल्य अलग होगा, क्या यह सही है? – Anon
सही। एक उदाहरण यह है कि MY_FUNCTION (X) को दिया गया मान पूर्णांक की एक विशिष्ट सीमा में होना चाहिए, और मैं यह कहना चाहता हूं कि एक्स सीमा में है। – NickB