2013-08-10 8 views
8

: मुख्य कार्यक्रम में फिरसी: नियत "स्थिर स्थिरांक चार * स्थिरांक" मैं कुछ वैश्विक इस तरह फ़ाइल के शीर्ष पर परिभाषित तार के साथ एक कार्यक्रम के लिए "स्थिर स्थिरांक चार *"

static const char * const STRING_A = "STRING A"; 
static const char * const STRING_B = "STRING B"; 

लूप मैं बार-बार एक समारोह बुलाता हूं। इस फ़ंक्शन में एक पॉइंटर होता है जो उपयोगकर्ता इनपुट के आधार पर उपर्युक्त तारों को इंगित करता है। डिफ़ॉल्ट रूप से मैं इसे STRING_A लिए सेट किया जा करना चाहते हैं, तो क्या मैं अनिवार्य रूप से है यह है:

// Called repeatedly from a loop. 
void input_function() 
{ 
    static const char *current = STRING_A; 

    // Do stuff and reassign different strings to "current" 
    ... 
} 

समस्या यह है कि मुझे लगता है कि जब संकलन मैं है "त्रुटि: प्रारंभकर्ता तत्व स्थिर नहीं है"। यह जीसीसी 4.7.2 का उपयोग कर रहा है। मुझे और क्या भ्रमित करता है कि अगर मैं इनपुट फ़ंक्शन में "स्थैतिक" कीवर्ड से छुटकारा पाता हूं तो त्रुटि दूर हो जाती है। हालांकि यह समाधान नहीं है, क्योंकि कॉल के बीच वर्तमान स्ट्रिंग का ट्रैक रखने के लिए फ़ंक्शन के लिए स्थिर कीवर्ड की आवश्यकता होती है।

स्पष्ट रूप से मैं इसे कई तरीकों से ठीक कर सकता हूं, बस कुछ कॉन्स्ट क्वालीफायरों से छुटकारा पाने के द्वारा। लेकिन मैं समझना चाहता हूं कि यह क्यों काम नहीं कर रहा है।

मेरी वर्तमान समझ यह है कि वैश्विक स्ट्रिंग चर को अलग-अलग तारों को इंगित करने के लिए संशोधित नहीं किया जा सकता है, और न ही उनके व्यक्तिगत वर्णों को संशोधित किया जा सकता है। स्थैतिक कीवर्ड उन्हें स्थानीय फ़ाइल स्रोत में रखता है।

current वैरिएबल के लिए मेरी समारोह में मेरी समझ है कि स्थिर कीवर्ड इस मामले में स्थिरांक क्वालीफायर मतलब यह है कि स्ट्रिंग बताया कि current द्वारा करने के लिए बदल सकते हैं यह कार्य करने के लिए कई कॉल से अधिक अपने मूल्य बनाए रखने के लिए अनुमति देता है, और है - लेकिन स्ट्रिंग के वर्ण जो यह इंगित करता है।

मुझे उन बयानों में कोई संघर्ष नहीं दिख रहा है, इसलिए मुझे समझ में नहीं आता कि संकलक एक त्रुटि क्यों देता है - विशेष रूप से यदि current के "स्थैतिक" विनिर्देशक को हटाया गया है तो उसे कोई समस्या क्यों नहीं है।

धन्यवाद अगर कोई यह बता सकता है कि समस्या क्या है।

उत्तर

7

6.7.8/4 [C99]:, इसलिए त्रुटि

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

STRING_A है न।

तरह से करने के लिए एक इससे बचने के लिए निम्नलिखित लाइनों के साथ होगा:

void input_function() 
{ 
    static const char *current = NULL; 
    if (current == NULL) { 
     current = STRING_A; 
    } 

    ... 
} 
+0

मैं अभी भी तेजी से उत्तर के लिए इसके चारों ओर मेरे सिर लेकिन धन्यवाद लपेटकर कर रहा हूँ। –

3

क्योंकि STRING_A एक संकलन समय स्थिर नहीं है यह। आपकी व्याख्याएं सही हैं, हालांकि आप स्थिरता को गैर-निरंतर मान (जैसे STRING_A) प्रारंभ नहीं कर सकते हैं।

संकलक को संकलित करते समय STRING_A अंक कैसे पता चलता है? यह नहीं है - STRING_A कार्यक्रम के प्रत्येक निष्पादन पर स्मृति के केवल-पढ़ने वाले खंड में अलग-अलग पतों पर इंगित करेगा, जहां स्ट्रिंग शाब्दिक स्मृति में निर्भर है।

आप इस संयम को हल करने के लिए निम्न ही प्रभाव संबंधित है, जबकि ऐसा करने की आवश्यकता होगी:

// Defines current to be a null pointer. 
static const char *current = NULL; 

// Determine if current is a null pointer. 
if (current == NULL) current = STRING_A; 
+0

त्वरित उत्तर के लिए धन्यवाद, मुझे इसे एनपीई को देना पड़ा क्योंकि वह किसी भी तरह से तेज था। एक बार फिर धन्यवाद। –

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