2012-11-09 17 views
5

मुझे अक्सर ऐसी स्थिति होती है जहां मुझे बिट शिफ्ट और मास्किंग ऑपरेशंस के उपयोग के लिए संकलन समय पर उत्पन्न कई स्थिरांक की आवश्यकता होती है।कंपाइलर प्रीप्रोसेसिंग के दौरान गणितीय परिचालन

उदा।

#define blockbits 8 
#define blocksize 256 // could be generated from 2^blockbits 
#define blocksize 0xFF // could be generated from blocksize - 1 

मैं चाहते हैं इन सभी, blockbits से उत्पन्न किया जा करने के लिए लेकिन कोई शक्ति आपरेशन कि पूर्वप्रक्रमक है कि मैं के बारे में पता कर रहा हूँ में इस्तेमाल किया जा सकता है।

क्या किसी को इस तरह की चीज संकलन समय पर उत्पन्न करने का एक आसान तरीका पता है?

+0

"हालांकि वहां कोई पावर ऑपरेशन नहीं है जिसका प्रयोग प्रीप्रोसेसर में किया जा सकता है जिसे मैं जानता हूं।" - वास्तव में? बिट शिफ्ट के बारे में क्या? –

+2

बीटीडब्ल्यू जो सी ++ हम बात कर रहे हैं, स्थिरांक के बजाय '# परिभाषित 'के लिए कोई अच्छा कारण है? – Kos

+0

क्या यह 'constexpr' के लिए नौकरी नहीं है? – DavidO

उत्तर

8

आप उन्हें गणितीय अभिव्यक्ति के रूप में परिभाषित कर सकते हैं:

#define blockbits 8 
#define blocksize (1 << blockbits) 
#define blockXXXX (blocksize - 1) // changed from blocksize to blockXXXX, since blocksize is already taken 

कोष्ठकों यकीन है कि वहाँ कोई ऑपरेटर पूर्वता मुद्दों जब आप उन्हें अन्य भाव में उपयोग कर रहे हैं बनाने के लिए कर रहे हैं।

आप शायद नामों को BLOCKBITS, BLOCKSIZE, आदि जैसे सभी अपरकेस में बदलना चाहें, जो कि सामान्य नामों से मैक्रोज़ को अलग करने के लिए एक सी ++ नामकरण सम्मेलन है।

+2

+1, प्रीप्रोसेसर उन्हें प्रतिस्थापित करेगा और संकलक मानों की गणना करेगा। – Kos

0

यदि आप # परिभाषा के बजाय कॉन्स्ट का उपयोग करना चाहते हैं और यदि आप जेनेरिक पावर फ़ंक्शन (केवल 2 की शक्तियों के लिए नहीं) बनाना चाहते हैं जो रनटाइम पर मानों की गणना करेगा, तो आप इसे इस तरह के टेम्पलेट्स के साथ करने का प्रयास भी कर सकते हैं:

template<int num, int pow> struct temp_pow 
{ 
    static const unsigned int result=temp_pow<num, pow-1>::result*num; 
}; 

template<int num> struct temp_pow<num, 1> 
{ 
    static const unsigned int result=num; 
}; 

const int BLOCKBITS = 8; 
const int BLOCKSIZE = temp_pow<2,BLOCKBITS>::result; // could be generated from 2^BLOCKBITS 
const int BLOCKSIZE_1 = BLOCKSIZE-1; 
संबंधित मुद्दे