2012-05-20 28 views
5

के साथ संरचना सदस्य संरेखण मैं निम्नलिखित के बारे में सोच रहा था: नया _Alignas संरेखण संरचना सदस्यों के लिए लागू C11 में निर्दिष्ट है?_Alignas

मैं हमेशा इतना मान लिया गया है, लेकिन N1570 सार्वजनिक मसौदा का पूरी तरह से पढ़ने संकेत मिलता है कि एक संरेखण-विनिर्देशक , एक विनिर्देशक-क्वालीफायर-सूची में प्रकट नहीं कर सकते हैं जो कि मैं कहाँ 'लगता है डी होने की उम्मीद है, अगर यह समर्थित था। मैं व्याकरण बार के एक जोड़े पढ़ा है लेकिन समझ नहीं कैसे _Alignas एक संरचना सदस्य घोषणा में अनुमति दी जा माना जाता है।

हालांकि, मुझे लगता है मानक के इरादे कि _Alignas_Alignas (§ 6.7.5) पर पैरा के रूप में सदस्यों की संरचना करने के लिए लागू किया जाना चाहिए है कि कहा गया है कि "एक संरेखण विशेषता में निर्दिष्ट नहीं किया जाएगा [...] एक बिट-फील्ड की घोषणा "। यह देखते हुए कि शब्द "बिट-फील्ड" को § 6.7.2.1 में परिभाषित किया गया है, एक संरचना सदस्य (सटीक शब्द: "ऐसे सदस्य को बिट-फील्ड" कहा जाता है), मैंने हमेशा उस वाक्य को व्याख्या की थी गैर-बिट-फील्ड सदस्यों के लिए स्पष्ट रूप से संरेखण विनिर्देशकों की अनुमति थी।

मौजूदा कार्यान्वयन के खिलाफ जांच कर रहा है पता चलता है कि दोनों बजना 3.0 और जीसीसी 4.7 समर्थन _Alignas संरचना के सदस्यों पर बिना (-pedantic के साथ) में शिकायत। बजना स्रोत कोड N1570 से ही व्याकरण reproduces, सिवाय Parser::ParseSpecifierQualifierList संरेखण विनिर्देशक अनुमति देता है; समारोह एक TODO तत्व सम्मिलित करता है, हालांकि, कि पढ़ता है:

/// TODO: diagnose attribute-specifiers and alignment-specifiers. 

जीसीसी सी पार्सर कोड समान, यानी भले ही यह उद्धरण मानक व्याकरण प्रतीत होता है, यह विनिर्देशक-क्वालीफायर में संरेखण विनिर्देशक की अनुमति देता है सूचियों।

मैंने ज्ञात दोषों की सूची भी जांच की है, साथ ही comp.lang.c और comp.std.c, यह देखने के लिए कि विषय वहां उठाया गया था, लेकिन यह प्रतीत नहीं होता है मामला। इसलिए, मेरा प्रश्न: संरेखण संरचना सदस्यों पर अनुमत होने वाले विनिर्देशक हैं?

संपादित करें: प्रासंगिक व्याकरण नियम हैं:

// Compare this... 
(6.7) declaration-specifiers: 
      storage-class-specifier declaration-specifiers_opt 
      type-specifier declaration-specifiers_opt 
      type-qualifier declaration-specifiers_opt 
      function-specifier declaration-specifiers_opt 
      // This seems to be the only place that mentions 
      // alignment-specifier on the rhs of a rule. 
      alignment-specifier declaration-specifiers_opt 

(6.7.2.1) struct-or-union-specifier: 
      struct-or-union identifier_opt { struct-declaration-list } 
      struct-or-union identifier 

(6.7.2.1) struct-declaration-list: 
      struct-declaration 
      struct-declaration-list struct-declaration 

(6.7.2.1) struct-declaration: 
      specifier-qualifier-list struct-declarator-list_opt ; 
      static_assert-declaration 

// ...to this. 
(6.7.2.1) specifier-qualifier-list: 
      type-specifier specifier-qualifier-list_opt 
      type-qualifier specifier-qualifier-list_opt 
      // Missing alignment-specifier specifier-qualifier-list_opt? 

(6.7.5) alignment-specifier: 
      _Alignas (type-name) 
      _Alignas (constant-expression) 

उत्तर

5

धारा 6.7.5, पृष्ठ 6, स्पष्ट रूप से बताता है कि यह भी सदस्यों

घोषित वस्तु के संरेखण आवश्यकता या के संरेखण से संबंधित है सदस्य पर निर्दिष्ट संरेखण किया गया है।

तो इच्छित अर्थ है कि एक है। यदि आप कहते हैं कि व्याकरण की औपचारिक विनिर्देश उस बिट को याद करता है (मैंने जांच नहीं की है), यह एक दोष है, और आपको इसकी रिपोर्ट करनी चाहिए।

संपादित करें: व्याकरण में देखकर, मुझे लगता है कि 0.6.7 में जोड़ा गया है।2.1 specifier-qualifier-list के मामलों में 2.1 गुम है, और यह भी कि पैरा 14 में एक पाठ स्पष्टीकरण क्रम में होगा।

+0

मैं देखता हूं --- मुझे उस बिट को याद आया (या शायद इसे कई बार फिर से पढ़ा जाए कि जब मैं अंततः एसओ पर पोस्ट करता हूं तो यह किसी भी तरह से फिसल जाता है); यह मेरी समझ भी थी, कि यह सदस्यों के लिए आवेदन करना था। लेकिन फिर मैंने क्लैंग और जीसीसी के आसपास जांच शुरू कर दी और उलझन में आ गया। यदि आपके पास समय है, तो क्या आप व्याकरण को भी देख सकते हैं? मैंने शायद कुछ भी याद किया होगा ... (चूंकि मैंने उस मार्ग को याद किया है जिसे आप उद्धृत कर रहे हैं, जो वास्तव में मंशा को स्पष्ट करता है) धन्यवाद। – rz0

+0

@ rz0, कृपया मेरा संपादन देखें। –

+0

तो यह सिर्फ मेरी चीजें नहीं देख रहा था ... इस मुद्दे को देखने के लिए समय निकालने के लिए धन्यवाद। एक दोष की रिपोर्टिंग के बारे में, मानक समिति AFAIK एक हर्मेमिक बॉडी है और मेरे जैसे इंटरनेट पर कुछ यादृच्छिक लड़के के लिए थोड़ा डरावना है। लेकिन अगर त्रुटि असली है, तो मुझे यकीन है कि विभिन्न कार्यान्वयनकर्ताओं के साथ शुरू होने वाला कोई भी व्यक्ति इसे जल्द या बाद में नोटिस करेगा। :) (क्लैंग कोड में TODO इंगित करता है कि कम से कम किसी ने 'विनिर्देशक-क्वालीफायर-सूची' में 'संरेखण-विनिर्देशक' की अनुपस्थिति देखी है।) – rz0