2012-01-20 16 views
12

मैं इसस्थिर स्थिरांक + स्थिरांक के रूप में सरणी बाध्य

Class.hpp की तरह कुछ कर रहा हूँ का उपयोग करना:

class Class { 

private: 
    static const unsigned int arraySize; 
    int ar[arraySize+2]; 
}; 

Class.cpp:

#include <Class.hpp> 
const unsigned int arraySize = 384; 

संकलक (क्यू ++, एक जी ++ के आधार पर क्यूएनएक्स ओएस के लिए सी ++ कंपाइलर) error: array bound is not an integer constant देता है जबकि Class.hpp (कक्षा.cpp संकलित करते समय) सहित एक इकाई को संकलित करते समय मुझे error: array bound is not an integer constant देता है।

यह क्यों काम नहीं कर रहा है? मुझे पता है कि एक स्थिर कॉन्स सदस्य को सी ++ मानक द्वारा गारंटीकृत सरणी के रूप में उपयोग किया जा सकता है (this anwser देखें)। लेकिन संकलक static const + const के परिणाम को निरंतर क्यों नहीं देखता है?

+1

मेरे लिए ठीक है (जीसीसी 4.6.1), जैसा कि इसे करना चाहिए। शायद उस कंपाइलर में एक बग? –

+0

मैंने अपने असली कोड से बेहतर मिलान करने के लिए अपना उदाहरण अपडेट किया। शायद सरणीकरण की अगली घोषणा के साथ कोई समस्या है? – MBober

+1

कृपया यहां देखें: [डीआर # 721] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#721)। यह हमेशा इरादा था (और सी ++ में 11 स्पष्ट रूप से मामला है) कि निरंतर के लिए प्रारंभकर्ता उस बिंदु पर दिखाई देना चाहिए जिस पर निरंतर अभिव्यक्ति के रूप में अर्हता प्राप्त करने के लिए स्थैतिक डेटा सदस्य या स्थिर चर का उपयोग किया जाता था। –

उत्तर

12

यह अच्छा कोड जो संकलक द्वारा स्वीकार किया गया है चाहिए:

class Class { 
    const static int arraySize = 384; 
    int ar[arraySize+2]; 
}; 

और अगर ऐसा नहीं है, तो अपने संकलक टूटी हुई है।

हालांकि, यदि आप चयनित अनुवाद इकाई में हेडर फ़ाइल से वास्तविक स्थिरता को स्थानांतरित करते हैं, तो कोड को अमान्य करता है।

// Class.h 
class Class { 
    const static int arraySize; 
    int ar[arraySize+2]; // ERROR 
}; 

// Class.cpp 
const int Class::arraySize = 384; 

इसका कारण यह है अपने Class वस्तु के आकार डेटा अकेले शीर्षक में उपलब्ध से संकलन समय पर निर्धारित नहीं किया जा सकता है। यह बिल्कुल सही कारण नहीं है, लेकिन इन पंक्तियों के साथ तर्क इस तरह संकलन त्रुटियों को समझने में मदद करता है।

ऐसी गलतियों से बचने के लिए, आप static const int को enum के साथ प्रतिस्थापित कर सकते हैं, उदा।

class Class { 
    enum { arraySize = 384 }; 
    int ar[arraySize+2]; 
}; 
+0

कामकाज के लिए धन्यवाद। मैं इसे खुद जानता था। लेकिन यह जांचना मेरे लिए महत्वपूर्ण है कि यह वैध सी ++ कोड है या नहीं। यदि आप सही हैं, तो हम उस कंपनी के खिलाफ शिकायत भर सकते हैं जिसने हमें कंपाइलर बेचा है। – MBober

+0

ओह, आप अपने प्रश्न में कोड में बदल गए हैं। हेडर से निरंतर दूर जाने से चीज़ें पूरी तरह से बदल जाती हैं। दूसरों को गुमराह करने से बचने के लिए मैं अपना जवाब अपडेट करूंगा। – bronekk

+0

धन्यवाद। गलतफहमी के लिए खेद है। – MBober

2

मुझे आश्चर्य है कि यह वास्तव में जीसीसी पर संकलित है, जैसा कि एक टिप्पणी कहती है। चूंकि 384 हेडर फ़ाइल में नहीं है, इसलिए Class का आकार अन्य संकलन इकाइयों के लिए ज्ञात नहीं है। यह कुछ संकलन इकाइयों में कोई फर्क नहीं हो सकता है कि कैसे/अगर वे Class उपयोग कर रहे हैं पर निर्भर करता है, लेकिन मैं इस संकलन की कल्पना नहीं कर सकते हैं:

// this is a source file called, say, blah.cpp 
#include <Class.hpp> 

void someFunc() 
{ 
    void *mem = malloc(sizeof(Class)); // size is not known, so this can't compile 

    // do something with mem 
} 

आप अपने .hpp में की आवश्यकता है:

class Class { 

private: 
    static const unsigned int arraySize = 384; 
    int ar[arraySize+2]; 
}; 

.. क्योंकि यह ओपी में है कि आप here से लिंक करते हैं।

+0

ओपी सवाल बदलो। मूल रूप से, स्थिरता हेडर में परिभाषित किया गया था। – avakar

+0

टिप्पणियां मेरे प्रश्न में उदाहरण कोड के पहले संस्करण का संदर्भ लें। हालांकि, अगर मैं सीधे अपने शीर्ष पर स्थिरांक को परिभाषित कर रहा हूं, तो यह ठीक से संकलित करता है। तो आप अपना जवाब संपादित कर सकते हैं और मैं इसे स्वीकार करूंगा। :) – MBober

+0

एमबीबर आप केवल एक जवाब स्वीकार कर सकते हैं। – CashCow

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