2012-10-05 13 views
13

Possible Duplicate:
Error “initializer element is not constant” when trying to initialize variable with constप्रारंभकर्ता तत्व सी में स्थिर नहीं है

मैं जावास्क्रिप्ट/php/अजगर से आ रहा हूँ और शायद मैं कुछ याद कर रहा हूँ, यहाँ कोड है:

const int a = 50; 
const int c = 100; 
const int d = 100; 
int endX = c + a; 
int endY = d; 
int startX, startY, b; 

मैं

मिल

ex1.4.c:6: error: initializer element is not constant
ex1.4.c:7: error: initializer element is not constant

किसी के पास स्पष्टीकरण है?

+1

देखो: सी में इस समस्या को संभालने के लिए हमेशा की तरह पूर्वप्रक्रमक बजाय का उपयोग करें। पूछने से पहले कृपया इस साइट को खोजें। –

+0

मैं आपके कोड को ठीक से संकलित कर सकता हूं। आप किस कंपाइलर/सिस्टम का उपयोग कर रहे हैं? – none

+0

@ गोकेशन: क्या आप किसी भी मौके से सी ++ कंपाइलर का उपयोग कर रहे हैं? –

उत्तर

4

यदि आप एंडएक्स को वैश्विक चर के रूप में घोषित कर रहे हैं तो त्रुटि समझ में आता है।

कारण यह है कि वैश्विक चर को संकलित करने में प्रारंभ किया जाता है, और आप एंडएक्स को एक ऑपरेशन के रूप में प्रारंभ करने की कोशिश कर रहे हैं जो निष्पादन समय में किया जाना चाहिए।

+4

-1। यह जवाब गलत है। निष्पादन समय से पहले एंडएक्स की गणना करने से कंपाइलर को रोकना कुछ भी नहीं है। वास्तव में, जी ++ खुशी से संकलित करेगा। यह सिर्फ जीसीसी है जो इसे स्वीकार करेगा इसके बारे में अत्यधिक क्रैकी है। – weberc2

2

हाँ, आप किसी चर को कुछ प्रारंभ नहीं कर सकते हैं। कंपाइलर प्रारंभिकता करता है और संकलन समय पर यह c+a के मान को नहीं जानता है;

int x = 1; प्रकार प्रारंभिकरण ठीक है, कंपाइलर ऑब्जेक्ट कोड में x के पते पर 1 डालता है।

c+a के लिए कुछ को प्रारंभ करने के लिए आपको C++ में c या निर्माता में कार्यावधि में यह करने के लिए, स्टार्टअप कोड में चाहते हैं।

0

सी प्रोग्रामिंग लैंगेज में, स्थैतिक भंडारण अवधि वाले ऑब्जेक्ट्स को निरंतर अभिव्यक्तियों (या समेकित अभिव्यक्ति वाले कुल योग) के साथ प्रारंभ किया जाना चाहिए। यदि endX में स्थिर संग्रहण अवधि है, तो इसके प्रारंभकर्ता (c+a) निरंतर अभिव्यक्ति नहीं है (यानी अनुवाद चरण के दौरान अभिव्यक्ति का मूल्यांकन नहीं किया जा सकता है)।

15

दुर्भाग्यवश, सी const चर में वास्तव में नहीं हैं।

नीचे सी 99 मानक से निष्कर्ष हैं।

6.6 Constant expressions

(7) More latitude is permitted for constant expressions in initializers. Such a constant expression shall be, or evaluate to, one of the following:

— an arithmetic constant expression,

— a null pointer constant,

— an address constant, or

— an address constant for an object type plus or minus an integer constant expression.

(8) An arithmetic constant expression shall have arithmetic type and shall only have operands that are integer constants, floating constants, enumeration constants, character constants, and sizeof expressions. Cast operators in an arithmetic constant expression shall only convert arithmetic types to arithmetic types, except as part of an operand to a sizeof operator whose result is an integer constant.

इस प्रकार, c और a निरंतर भाव नहीं हैं और के रूप में इस्तेमाल नहीं किया जा सकता: इस प्रकार

6.4.4 Constants

Syntax

constant:

integer-constant  (e.g. 4, 42L) 
floating-constant  (e.g. 0.345, .7) 
enumeration-constant (stuff in enums) 
character-constant  (e.g. 'c', '\0') 

मानक स्थिर भाव परिभाषित करता है:

6.7.8 Initialization

  1. All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

स्थिरांक इस प्रकार परिभाषित कर रहे हैं आपके मामले में प्रारंभिक।

5

const अभिव्यक्ति सी ++ के विपरीत सी में एक संकलन समय स्थिर होना चाहिए इसलिए c+a निरंतर उपयोग नहीं किया जा सकता है। इस सवाल यह कई बार कहा गया है से पहले के दाईं तरफ पैनल पर

#define A 50 
#define C 100 
#define D 100 
int endX = C + A; 
int endY = D; 
int startX, startY, b; 
+1

यदि 'c' और' a' संकलन समय स्थिरांक हैं, तो 'c + a' भी है (और कुछ भी जिस पर अभिव्यक्ति असाइन की गई है)। ऐसा नहीं है कि सी ++ को संकलन-समय स्थिरांक होने के लिए कॉन्स एक्सप्रेशन की आवश्यकता नहीं होती है; यह है कि सी ++ यह समझने के लिए पर्याप्त स्मार्ट है कि 'const int + const int' एक संकलन समय स्थिर है, जबकि सी इतना स्मार्ट नहीं है। – weberc2

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