2012-05-16 15 views
6

में __attribute__ का उपयोग करके असंतुलित ब्रांडेसिस आज मैंने कुछ समय पहले विकसित एक परियोजना पर झुकाव की कोशिश की। जब मुझे संकलन त्रुटि का सामना करना पड़ा, तो मुझे आश्चर्य हुआ, क्योंकि मैंने अपनी परियोजना को जी ++ का सफलतापूर्वक संकलित किया था।जी ++

int main() { 
    __attribute__((aligned(16)) char arr[5]; 
} 

कौन इस त्रुटि पैदा करता है:

test.cpp:2:32: error: expected ')' 
    __attribute__((aligned(16)) char arr[5]; 
          ^
           ) 

आप देख सकते हैं, वहाँ एक umbalanced कोष्ठक है

यह छोटा स्निपेट लाइन जहां त्रुटि आई थी reproduces। तीन '(', और दो ') हैं। यह स्पष्ट रूप से ऐसा लगता है कि इसे वास्तव में एक संकलन त्रुटि उत्पन्न करना चाहिए।

क्या यह इस कीवर्ड का वैध उपयोग है? मुझे the documentation पर कुछ भी नहीं मिल रहा है जो इंगित करता है कि यह है।

मैं जी ++ 4.5.2 और क्लैंग 2.8 का उपयोग कर रहा हूं।

ध्यान दें कि g ++ के बजाय gcc का उपयोग करते समय यह त्रुटि पता चला है।

+0

[जीसीसी दस्तावेज] (http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html) कहता है * "कीवर्ड '__attribute__' आपको चर या संरचना फ़ील्ड के विशेष विशेषताओं को निर्दिष्ट करने की अनुमति देता है। * * इस कीवर्ड के बाद डबल ब्रांड्स के अंदर एक विशेषता विनिर्देशन होता है "***। इसलिए यह समान संख्या में ब्रांड्स के साथ बंद होने के बारे में सटीक स्पष्ट शब्दों में नहीं कहता है लेकिन सभी जीसीसी उदाहरण मिलान करने वाले कोष्ठक दिखाते हैं, इसलिए एक बग की तरह दिखता है। –

+0

हां, ऐसा लगता है कि यह वास्तव में एक बग है। मुझे कुछ भी नहीं मिला जो विपरीत संकेत दे सकता है। – mfontanini

+0

@ डेविडरोड्रिग्ज-ड्राईबीस क्लैंग इसका समर्थन करता है। मेरा मतलब है, यह वास्तव में ऐसा लगता है कि g ++ उस एक्सप्रेशन को सही ढंग से पार्स नहीं कर रहा है। क्लैंग सही काम कर रही है (कम से कम मुझे संदेह है ... यही कारण है कि मैं पूछ रहा हूं: डी) यहां एक त्रुटि की रिपोर्ट करते समय। – mfontanini

उत्तर

3

यह एक कंपाइलर बग होगा। कंपाइलर __attribute__ देखता है, इसके बाद दो उद्घाटन कोष्ठक, कुछ अन्य टोकन और फिर दो समापन कोष्ठक, जो शायद “ परिभाषा ” है जो __attribute__ जैसा दिखना चाहिए, उदा।

<attribute> ::= __attribute__ '((' something '))'

मेरा अनुमान है कि बीच में टोकन aligned(16 के रूप में और कुछ चमत्कार यह अभी भी काम करता है से व्याख्या की जा रही है है।

+0

बिल्कुल सही। मैंने इसे जीसीसी के बगजिला पर एक बग के रूप में बताया है। – mfontanini

+0

हां, शायद यह है '__attribute__' से अधिक 'गठबंधन') के साथ करने के लिए, क्योंकि' __attribute __ ((पैक किया गया) 'संकलित नहीं होता है। – mfontanini

+2

यह मेरी आंखों में एक बग नहीं हो सकता है क्योंकि असंतुलित कोष्ठक शायद ही कभी आप चाहते हैं, लेकिन यदि जीसीसी किसी भी प्रकार के टोकन को '((' और ')) के भीतर प्रकट करने की अनुमति देता है, तो उसे एक बग नहीं माना जा सकता है। '__attribute __ ((((((())' और 'देखें कि क्या यह शिकायत करता है कि असंतुलित कोष्ठक के बजाय अज्ञात विशेषता। – dreamlax