2009-08-02 15 views
7

में किसी प्रकार का आकार प्राप्त करना क्या सी ++ में ऐसा कुछ करने का कोई तरीका है, ऐसा लगता है कि किसी कारण से इसका उपयोग नहीं किया जा सकता है?सी ++ मैक्रो सशर्त

#if sizeof(wchar_t) != 2 
#error "wchar_t is expected to be a 16 bit type." 
#endif 
+0

सीख लिया कि बिल्ड-टाइम आवेषण संभव है, आपके प्रश्न के लिए धन्यवाद। इस तकनीक पर इस धागे पर विस्तार से चर्चा की गई है: http://stackoverflow.com/questions/174356/ways-to-assert-expressions-at-build-time-in-c – nagul

उत्तर

4

मुझे लगता है कि BOOST_STATIC_ASSERT जैसी चीजों में मदद कर सकता WCHAR_MIN और WCHAR_MAX मैक्रो है।

14

नहीं, यह है क्योंकि सभी मैक्रो विस्तार (# ... बातें) पूर्व प्रोसेसर कदम में किया जाता है जो सी ++ कोड के प्रकार के बारे में कुछ भी पता नहीं है नहीं किया जा सकता है और यहां तक ​​नहीं है भाषा के बारे में कुछ भी जानने की जरूरत है! यह सिर्फ # ... चीजें फैलाता है/जांचता है और कुछ भी नहीं!

कुछ अन्य आम त्रुटियों उदाहरण के लिए, कर रहे हैं:

enum XY 
{ 
    MY_CONST = 7, 
}; 

#if MY_CONST == 7 
    // This code will NEVER be compiled because the pre-processor does not know anything about your enum! 
#endif // 

आप कर सकते हैं #if में केवल का उपयोग और उपयोग चीजें हैं जो संकलक करने के लिए या #define के माध्यम से कमांड लाइन विकल्पों के माध्यम से परिभाषित कर रहे हैं।

+0

आजकल, प्रीप्रोसेसर कभी-कभी मौजूद नहीं होता है। –

+0

@ कोले जॉनसन: मैं कभी भी प्री-प्रोसेसर को पूरी तरह से छोड़ने वाला नहीं देखता हूं। क्या आप प्री-प्रोसेसर के बिना किसी सी या सी ++ कंपाइलर के बारे में जानते हैं? – mmmmmmmm

+0

मुझे नहीं पता कि।मैं 'pragma' –

3

आकार() एक रनटाइम संकलन-समय फ़ंक्शन है। आप प्रीप्रोसेसर निर्देश में इसे कॉल नहीं कर सकते हैं। मुझे नहीं लगता कि आप preprocessing के दौरान wchar_t के आकार की जांच कर सकते हैं। (संपादित करें 2 देखें)

संपादित करें: के रूप में टिप्पणी में कहा, sizeof() ज्यादातर संकलन समय पर गणना की है। सी 99 में, it can be used at runtime for arrays

संपादित करें 2: आप thread में वर्णित तकनीकों का उपयोग करके निर्माण समय पर जोर दे सकते हैं।

+7

sizeof() जैसे सामानों का जिक्र कर रहा था() रनटाइम फ़ंक्शन नहीं है। यह एक संकलन-समय अभिव्यक्ति है जिसे संकलन-समय पर संकलक द्वारा मूल्यांकन किया जाता है (लेकिन प्री-प्रोसेसर समय के बाद)। – mmmmmmmm

+0

धन्यवाद, इसके बारे में पता नहीं था। तदनुसार अपडेट किया गया। – nagul

+1

@nagul: ठीक है, शायद हमेशा एक संकलन-समय अभिव्यक्ति नहीं :-) – mmmmmmmm

7

प्रीप्रोसेसर प्रकारों, यहां तक ​​कि बिल्टिन के बारे में कुछ भी जानने के बिना काम करता है।

बीटीडब्लू, आप अभी भी एक static_assert सुविधा का उपयोग कर चेक कर सकते हैं (उदाहरण के लिए बूस्ट में एक है, सी ++ 0 एक्स एक होगा)।

संपादित करें: C99 और C++ 0x भी <stdint.h>

1
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1]; 
3

क्या आप मूल रूप से प्राप्त नहीं करेंगे जो आप चाहते हैं (एक त्रुटि C /ASSERT का उपयोग कर त्रुटि को संकलित करें)?

#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1] 
0

मैंने कुछ मैक्रोज़ विकसित किए हैं जो प्रभावी रूप से आपको मैक्रो स्थिति के आकार का उपयोग करने की अनुमति देंगे। वे एक हेडर फ़ाइल में हैं जिन्हें मैंने here (एमआईटी लाइसेंस) अपलोड किया है। SIZEOF(unsigned, long, int) भीतर

#include <iostream> 
#include "SIZEOF_definitions.h" 

//You can also use SIZEOF_UINT in place of SIZEOF(unsigned, int) 
// and UINT_BIT in place of SIZEOF_BIT(unsigned, int) 
#if SIZEOF(unsigned, int) == 4 
int func() { return SIZEOF_BIT(unsigned, int); } 
#elif SIZEOF(unsigned, int) == 8 
int func() { return 2 * SIZEOF_BIT(unsigned, int); } 
#endif 

int main(int argc, char** argv) { 
    std::cout SIZEOF(unsigned, long, int) << " chars, #bits = " << SIZEOF_BIT(unsigned, long, int) << '\n' 
     << SIZEOF(unsigned, int)  << " chars, #bits = " << SIZEOF_BIT(unsigned, int)  << '\n' 
     << SIZEOF(int)     << " chars, #bits = " << SIZEOF_BIT(int)     << '\n'; 
    std::cout << func() << std::endl; 
    return 0; 
} 

नोट के लिए अल्पविराम:

यह इस तरह कोड के लिए अनुमति देगा।

संबंधित मुद्दे