2010-02-23 13 views
10

मैं इस है:मैं #if में sizeof() का उपयोग क्यों नहीं कर सकता?

#if sizeof(int) 
    #error Can't use sizeof in a #if 
#endif 

मैं इस संकलक त्रुटि मिलती है:

missing binary operator before token "(" 

मैं यहाँ sizeof ऑपरेटर का उपयोग क्यों नहीं कर सकते?

+2

यह ख है ईन ने कई बार पूछा। बस एक खोज करो। यहां एक उत्तर दिया गया है, उदाहरण के लिए, http://stackoverflow.com/questions/1717665/c-throwing-compilation-error-on-sizeof-comparison-in-preprocessor-if – AnT

+0

मुझे लगता है कि आप LISP या योजना की तलाश में हैं :) – leppie

उत्तर

12

क्योंकि प्रीप्रोसेसर चलाने के बाद आकार() की गणना की जाती है, इसलिए जानकारी #if के लिए उपलब्ध नहीं है।

सी कंपाइलर तार्किक रूप से दो चरणों में विभाजित होते हैं, भले ही अधिकांश आधुनिक कंपाइलर्स उन्हें अलग न करें। सबसे पहले, स्रोत preprocessed है। इसमें सभी प्रीप्रोसेसर सशर्त (2if, #define, परिभाषित शब्दों को उनके प्रतिस्थापन के साथ बदलकर) को बाहर निकालना और प्रतिस्थापित करना शामिल है। तब स्रोत को संकलित करने के लिए, संसाधित किया जाता है। प्रीप्रोसेसर केवल सी की संरचना के बारे में कम से कम अवगत है, इसमें कोई प्रकार का ज्ञान नहीं है, इसलिए यह आकार() के रूप में संकलक-स्तर संरचनाओं को संभाल नहीं सकता है।

2

क्योंकि आप केवल प्रीप्रोसेसर निर्देश में शाब्दिक स्थिरांक का उपयोग कर सकते हैं। इसके अलावा, आकार (int) 0 से हमेशा बड़ा होता है, इसलिए मेरा मानना ​​है कि यह #if वैसे भी सच होगा।

+0

यह मेरे हिस्से पर एक बुरा उदाहरण था। मैं अपने सभी परियोजना-विशिष्ट विवरणों को बाहर करने की कोशिश कर रहा था और इस उदाहरण के साथ आया था। – Robert

+1

कड़ाई से सच नहीं है: आप बुलियन ऑपरेशन कर सकते हैं और कुछ फ़ंक्शन-जैसे कॉल ('परिभाषित()') हैं। कुछ प्रीप्रोसेसर अतिरिक्त सामानों के शेड-लोड की अनुमति देते हैं (मैंने लोगों को प्रीप्रोसेसर में लॉग ऑपरेटरों के लिए कहा है, क्योंकि वे उन्हें एम्बेडेड कंपाइलर के साथ इस्तेमाल करेंगे)। –

0

#if एक प्रीप्रोसेसर निर्देश है।
sizeof() एक सी ऑपरेटर है, और संकलन समय पर गणना की जाती है।

प्रीप्रोसेसर (जब #if संभाला जाता है) के समय, सी ऑपरेटरों को निष्पादित नहीं किया जाता है।

+0

'sizeof' लाइब्रेरी फ़ंक्शन नहीं है, यह एक ऑपरेटर है। – avakar

+0

कड़ाई से सच नहीं है: sizeof() एक भाषा सुविधा है, लाइब्रेरी फ़ंक्शन नहीं। कुछ सी 99-विशिष्ट जादूगर के अलावा, संकलन समय पर इसका मूल्यांकन किया जाता है। –

+0

ऑपरेटर होने के आकार के बारे में टिप्पणी के लिए धन्यवाद .... मेरा जवाब तय करें। –

-3

पर विचार करें:

#if sizeof(MyClass) > 3 
    #define MY_CONSTRAINT 2 
#endif 

class MyClass 
{ 
    #if MY_CONSTRAINT == 3 
     int myMember = 3; 
    #endif 
}; 

अब, यह prolly सही सिंटैक्स में नहीं लिखा है के रूप में यह पिछली बार मैं सी ++ किया के बाद से समय हो गया है, लेकिन बात अभी भी खड़ा है :)

+0

आप क्या इंगित करते हैं? – Ponkadoodle

+2

इस पर वापस देखकर, मुझे वास्तव में पता नहीं है :) – cwap

+0

हाहा, मैं ईमानदारी की सराहना करता हूं: पी ग्लेड आपने शत्रुता के रूप में मेरी टिप्पणी की व्याख्या नहीं की। – Ponkadoodle

-3

बस का उपयोग साधारण अगर-बाकी

if  (sizeof(x)==2) {...} 
else if (sizeof(x)==4) {...} 
else     {...} 

और संकलक संकलन समय में यह अनुकूलित करेंगे ...

+0

पूरा बिंदु समय घोषणाओं को संकलित करता है। – vitiral

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